5

尝试访问后端(Apollo GraphQL)并返回 401 因为令牌已过期或无效时,清除 NextAuth.js 会话的最佳方法是什么?

我想过一个errorLinkand signout,但据我所知signout不能在服务器端使用getServerSideProps,而只能在客户端使用。

推荐的方法是什么?有没有其他方法可以实现中间件来处理这种情况?

谢谢

4

2 回答 2

4

signOut() 通过清除客户端的状态来清除会话,在这里您可以做的是从后端检查状态是否存在,如果不存在,则执行某些操作而不是 401(未授权)。希望您阅读:https ://next-auth.js.org/getting-started/client#signout

于 2020-12-01T06:23:36.243 回答
0

这取决于您使用的 Apollo 版本,但假设您使用的是 Apollo 3.0 <= 您可以为您的请求创建一个 setcontext。

import { setContext } from '@apollo/client/link/context';

const authLink = setContext((_, { headers }) => {
  const token = session?.accessToken ? session.accessToken : ""
  return {
    headers: {
      ...headers,
      authorization: token ? `Bearer ${token}` : "",
    }
  }
});

function createApolloClient(session) {
  return new ApolloClient({
    cache: new InMemoryCache(),
    ssrMode: typeof window === 'undefined',
    link: from([
      authLink,
      errorLink,
      createUploadLink({
        uri: GRAPHQL_URI,
        credentials: 'same-origin'
      }),
    ]),
  });
}

由于 signOut() 会重新呈现您的应用程序,因此您可以检查上下文以查看它是否具有来自服务器的请求的有效令牌。尚未对此进行测试,但理论上这就是我可以实现它的方式。

于 2020-11-29T14:22:18.757 回答