【问题标题】:NextAuth.js signout if Apollo GraphQL token is invalid or it has expired如果 Apollo GraphQL 令牌无效或已过期,则 NextAuth.js 注销
【发布时间】:2021-03-05 07:09:00
【问题描述】:

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

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

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

谢谢

【问题讨论】:

  • 您能给我们提供一个minimal reproducible example吗?
  • 我添加了我正在尝试使用的 errorLink,但正如我所说,signOut() 仅在客户端可用。

标签: reactjs graphql next.js apollo next-auth


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这取决于您使用的 Apollo 版本,但假设您使用的是 Apollo 3.0

    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-04-16
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 2021-05-09
      • 2020-02-20
      • 1970-01-01
      相关资源
      最近更新 更多