ped*_*nna 0 javascript jwt strapi next.js next-auth
我正在使用Next.js (11.1.2) + NextAuth (^4.0.5) + Strapi(3.6.8)进行项目。
我正在使用 Next Auth 凭据提供程序,它工作正常。但我需要使用 访问一些用户信息session,因此我尝试使用jwt和session回调来执行此操作。
当我在内部记录来自 Strapi 的响应时authorize(),我收到了{ jwt:{}, user:{} },所以没问题。
//[...nextauth.js]
async authorize(credentials, req) {
try {
const { data } = await axios.post(process.env.CREDENTIALS_AUTH_URL, credentials)
if (data) {
//console.log('data: ', data) //this is ok
return data;
}
else {
return null;
}
} catch (e) {
return null;
}
},
Run Code Online (Sandbox Code Playgroud)
但是,在jwt回调中,当我登录时token,我得到一个奇怪的对象{token:{token:{token:{...}}}:
// [...nextauth.js] callback:{ jwt: async (token) => { console.log(token) }}
token: {
token: {
token: {},
user: {
jwt: ...,
user: [Object]
},
account: { type: 'credentials', provider: 'credentials' },
isNewUser: false,
iat: ...,
exp: ...,
jti: ...
}
}
Run Code Online (Sandbox Code Playgroud)
并且account和user在该回调中始终未定义。
最后,当我进入session页面useSession时,我得到以下信息:
// console.log(session) in any page
{
session: {
expires: "2022-01-12T19:27:53.429Z"
user: {} // empty
},
token:{
token:{
account: {type: 'credentials', provider: 'credentials'}
exp: ...
iat: ...
isNewUser: false
jti: "..."
token: {} // empty
user: { //exactly strapi response
jwt:{...}
user:{...}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我发现的所有示例都没有使用这种混乱的结构来处理这个对象,我不知道我是否遗漏了一些东西。你能帮助我吗?
这是我的[...nextauth].js:
import NextAuth from "next-auth"
import CredentialsProvider from 'next-auth/providers/credentials'
import axios from 'axios';
export default NextAuth({
providers: [
CredentialsProvider({
name: '...',
credentials: {
email: {label: "Email", type: "text", placeholder: "email@provider.com"},
password: { label: "Password", type: "password" },
},
async authorize(credentials, req) {
try {
const { data } = await axios.post(process.env.CREDENTIALS_AUTH_URL, credentials)
if (data) {
//console.log('data: ', data)
return data;
}
else {
return null;
}
} catch (e) {
return null;
}
},
})
],
secret: process.env.SECRET,
session: {
strategy: 'jwt',
maxAge: 30 * 24 * 60 * 60 // 30 days
},
jwt: {
secret: process.env.JWT_SECRET,
encryption: true,
},
callbacks: {
jwt: async (token, account) => {
console.log('### JWT CALLBACK ###')
console.log('token: ', token)
console.log('account: ', account)
return token;
},
session: async (session, token, user) => {
console.log('### SESSION CALLBACK ###')
console.log('session: ', session)
console.log('user: ', token)
console.log('user: ', user)
return session;
}
},
pages: {
signIn: '/signin',
signOut: '/signin',
error: '/signin'
}
})
Run Code Online (Sandbox Code Playgroud)
小智 5
请尝试:
- session(session, tokenOrUser)
+ session({ session, token, user })
Run Code Online (Sandbox Code Playgroud)
- jwt(token, user, account, OAuthProfile, isNewUser)
+ jwt({ token, user, account, profile, isNewUser })
Run Code Online (Sandbox Code Playgroud)
https://next-auth.js.org/getting-started/upgrade-v4#callbacks