NextAuth:JWT 回调返回对象

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,因此我尝试使用jwtsession回调来执行此操作。

当我在内部记录来自 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)

并且accountuser在该回调中始终未定义。

最后,当我进入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