我在文档方面遇到了一些问题,似乎无法弄清楚我应该如何对数据库的请求进行身份验证。我有一个RLS,它只允许用户修改他们拥有的东西,即。其具有带有其user_id的列。
到目前为止,在客户端上我有这个片段:
const session = await supabase.auth.getSession();
const jwt = session.data.session?.access_token;
try {
const response = await fetch(`/api/word/${route}`, {
method,
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${jwt}`,
apiKey: jwt as string,
},
body: JSON.stringify(word),
});
它将JWT发送到我的服务器,我想从那里执行DB查询。
然而,我一生都无法弄清楚如何使用JWT服务器端来做到这一点。我试过用JWT创建一个新的supabase客户端,但是不起作用。我在网上看到的其他例子是针对supabasev1的,比如API(jwt),或者类似的东西,它们不起作用。
这是我的API路由。我决定导入auth helpers库,因为这似乎是尝试前进的最可行的方法:
export default async function handler(
req: NextApiRequest,
res: NextApiResponse<Data | string>
) {
try {
const word = req.body;
const jwt = req.headers.authorization;
const supabase = createServerSupabaseClient({
req,
res,
});
const user = await supabase.auth.getUser(jwt);
const { count, error } = await supabase
.from("words")
.select("name", { head: true, count: "exact" })
.eq("name", word);
if (count) {
res.status(409).send("Word already saved");
} else {
// TODO handle error
const { data, error } = await supabase
.from("words")
.insert({ name: word, user_id: user?.id });
console.log(data, error);
res.status(200).send("OK");
}
} catch (err) {
res.status(500).send("Something went wrong!");
}
}
这里创建的用户变量(等于awaitsupabase.auth.getUser(jwt))具有空数据和一条错误消息“no Route matched with those values”
1条答案
按热度按时间uurity8g1#
我尝试了你的方法,通过删除请求中的
Bearer
,它可以工作。以下是我的案例:在我的API路线上: