reactjs jwt回调中的下一个认证 checkout

laximzn5  于 2023-04-29  发布在  React
关注(0)|答案(2)|浏览(197)

如果用户在应用程序升级之间登录到应用程序,那么我希望在用户下次访问时注销该用户。
我从package.json中提取版本并将其存储在jwt/session中,以便比较用户验证的版本和现在运行的版本。

// pages/api/auth/[nextauth].ts
const version = require('../../../package.json').version
import NextAuth from 'next-auth'
import { signOut } from 'next-auth/react'

export default NextAuth({
  providers: [ /*...*/ ],
  session: { strategy: 'jwt' },
  callbacks: {
    async jwt(props) {
      const { token, user, account } = props
      const isSignIn = user?.username ? true :false
      if(isSignIn) {
        token.version = version
        // ...
      }
      if (token?.version !== version) {
        await signOut()
        return {}
      }
      return token
    },
    // ...
  }
})

这可以工作,但是它抛出了一个错误

https://next-auth.js.org/errors#jwt_session_error window is not defined {
  message: 'window is not defined',
  stack: ...
  name: 'ReferenceError
}

我知道这个错误是抛出的,因为我在服务器端调用signOut函数,而它本来是一个浏览器端函数,因此window的错误没有定义。
我怎么才能调用signOut函数而不尝试使用浏览器端调用,包括对window的引用?

0sgqnhkj

0sgqnhkj1#

你不能在我收集的服务器端使用signOut,但这里有一个我在我的情况下使用的技巧。相反,尝试从服务器端signOut返回错误代码。

const version = require('../../../package.json').version
import NextAuth from 'next-auth'
import { signOut } from 'next-auth/react'

export default NextAuth({
  providers: [ /*...*/ ],
  session: { strategy: 'jwt' },
  callbacks: {
    async jwt(props) {
      const { token, user, account } = props
      const isSignIn = user?.username ? true :false
      if(isSignIn) {
        token.version = version
        // ...
      }
      if (token?.version !== version) {
        return {
        // You can ignore this if you don't need the previous data
         ...token,
        // Return an error code 
         error: "invalid-version",
        }
      }
      return token
    },
    // ...
  }
})

在安全路由周围创建 Package 器。你也可以在一个普通的布局中这样做。

export const Auth = ({children}) => {
  const { data: sessionData } = useSession();
  const router = useRouter();

  useEffect(() => {
    // check if the error has occurred
    if (sessionData?.user.error === "invalid-version") {
        // Sign out here
        signOut();
    }
  }, [sessionData?.user.error, router]);

  return (
    <>{children}</>
  )
}
6jjcrrmo

6jjcrrmo2#

如前所述,signOut()仅限于客户端。在NextJS的服务器端使用它会给予你这个引用错误。
Kwaku Hubert有一个很好的返回响应的解决方案。错误,您可以在客户端if语句中使用该错误,然后触发signOut()。
Next-Auth也有API端点,你可以调用它来做一些事情。SignOut()只是发送一个POST到”/API/auth/signout”。所以你可以直接在服务器端发送一个post,而不是使用signOut()。
https://next-auth.js.org/getting-started/rest-api#post-apiauthsignout

相关问题