5

确认凭据后,我返回以下 JSON:

{username: 'foo', name: 'bar', type: 123}

但是,由于模型限制,NextAuth 不允许我存储所有字段,所以它在 J​​WT 中返回给客户端的是:

{name: 'bar', email: null, image: null}

我的[...nextauth].js设置非常基本:

providers: [
    Providers.Credentials({
        async authorize(credentials) {
            const res = await fetch('http://localhost:3000/api/user', {
                method: 'GET',
                headers: {
                    'Accept': 'application/json',
                    'Content-Type': 'application/json',
                    'credentials': JSON.stringify(credentials)
                }
            })
            const user = await res.json()
            
            if (user && !user.message) {
                return user
            } else {
                return null
            }
        }
    })
],

我想出的唯一解决方案是使用 JSON 字符串伪造电子邮件字段,我可以在其中存储我需要的所有内容:

{name: 'bar', email: "{username: 'foo', type: 123}", image: null}

我怎样才能正确地做到这一点?我尝试研究自定义模型(https://next-auth.js.org/tutorials/typeorm-custom-models),但它似乎只是关于数据库,这不是我的情况,因为我使用 JWT 进行会话存储。如果我继续我的解决方案,我还会遇到什么缺点?

4

1 回答 1

9

You will need to persist the additional info through callbacks, at first through JWT's callback and then Session's callback:

  callbacks: {
    async jwt(token, user, account, profile, isNewUser) {
      // Since you are using Credentials' provider, the data you're persisting 
      // _should_ reside in the user here (as far as can I see, since I've just tested it out).
      // This gets called whenever a JSON Web Token is created (once) or updated
      if (user?.type) {
        token.status = user.type
      }
      if (user?.username) {
        token.username = user.username;
      }
      
      return token
    },
  
    async session(session, token) {
      session.type = token.type;
      session.username = token.username;
      
      return session
    }
  }
于 2021-04-15T06:51:10.920 回答