如何从NextJS API路由进行认证的supabase查询?

yhqotfr8  于 2023-06-05  发布在  其他
关注(0)|答案(1)|浏览(205)

我在文档方面遇到了一些问题,似乎无法弄清楚我应该如何对数据库的请求进行身份验证。我有一个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”

uurity8g

uurity8g1#

我尝试了你的方法,通过删除请求中的Bearer,它可以工作。以下是我的案例:

const resReviews = await fetch(
    `${URL_API}/reviews/profile/${session.user.id}`,
    {
      method: "GET",
      headers: {
        Authorization: `${access_token}`,
      },
    }
  );

在我的API路线上:

const supabaseServerClient = createPagesServerClient<Database>({
      req,
      res,
    });
const jwt = req.headers.authorization;
const currentUserId = (
   await supabaseServerClient.auth.getUser(jwt as string)
   ).data.user?.id;

相关问题