NodeJS 如何使用POST /API/auth/signout端点和Next Auth注销?

x33g5p2x  于 2023-04-20  发布在  Node.js
关注(0)|答案(2)|浏览(164)

这篇Reddit的帖子建议“在signOut事件中调用一个API。后端处理了剩下的部分。”
当然,让我们写下来:

await fetch('/api/auth/signout', { method: "POST" });

除了请求通过302重定向到GET /api/auth/signout?csrf=true,然后重定向到GET /auth/sign-out,我的自定义注销页面;用户未 checkout 。
documentation确实指定了“POST提交需要来自/API/auth/csrf的CSRF令牌”,但是没有使用示例。
点击/api/auth/csrf我得到一个JSON响应,所以我只是使用该值作为初始POST请求的主体:

await fetch('/api/auth/signout', {
  method: "POST",
  body: await fetch('/api/auth/csrf').then(rs => rs.text())
});

它确实发出了一个请求,然后添加了一个{"csrfToken":...}的有效负载,但是进行了相同的重定向,用户仍然没有注销。
我的目标是在调用最初的POST请求时注销并且不被重定向。这可能吗?

dkqlctbz

dkqlctbz1#

我差一点就成功了。这是最后成功的请求:

await fetch('/api/auth/signout?callbackUrl=/api/auth/session', {
  method: "POST",
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json',
  }
  body: await fetch('/api/auth/csrf').then(rs => rs.text())
});

该回调仅用于不被重定向到登录页面,这是默认行为。
即使主体是字符串,Content-type也是JSON;这告诉Next.js如何解析body的内容。

xqk2d5yq

xqk2d5yq2#

使用signIn回调并返回一个url/string。

export const authOptions: NextAuthOptions = {
  callbacks: {
    signIn({ user }) {
      if (user?.email !== 'my-email@gmail.com') {
        return '/';
      }

      return true;
    },
  },
};

然而,我的建议(以及next-auth的建议)是将它们返回到错误页面。如果返回false,默认情况下会发生这种情况。

signIn({ user }) {
  return user?.email === 'my-email@gmail.com';
},

如果你想进一步阅读,这里是他们的文档。

相关问题