jwt 回调中的 Next-Auth Signout
Next-Auth Signout within jwt callback
如果用户在应用升级之间登录了应用,那么我想在他们下次访问时注销用户。
我正在从 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
的错误未定义。
如果不尝试使用包括对 window
的引用在内的浏览器端调用,我还能如何调用 signOut
函数?
根据我收集到的信息,您不能在服务器端使用 signOut,但这是我在我的案例中使用的一个技巧。而是尝试从服务器端注销 return 一个错误代码。
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
},
// ...
}
})
围绕安全路由创建包装器。您也可以在通用布局中执行此操作。
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}</>
)
}
如果用户在应用升级之间登录了应用,那么我想在他们下次访问时注销用户。
我正在从 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
的错误未定义。
如果不尝试使用包括对 window
的引用在内的浏览器端调用,我还能如何调用 signOut
函数?
根据我收集到的信息,您不能在服务器端使用 signOut,但这是我在我的案例中使用的一个技巧。而是尝试从服务器端注销 return 一个错误代码。
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
},
// ...
}
})
围绕安全路由创建包装器。您也可以在通用布局中执行此操作。
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}</>
)
}