登录后在哪里以及如何更改会话用户对象?

Mat*_*ski 7 javascript node.js reactjs next.js next-auth

我有一个奇怪的问题,我不知道问题出在哪里。我使用next-auth库在我的Next.js应用程序中制作身份验证系统。

一切正常 - 我可以通过检查是否有google firebase提交凭据的帐户登录,session是否正确创建,但是当authorize回调初始化时,我传递google firestore正确登录后收到的数据。用户对象包含整个数据并且它被向前传递。

然后,当我想从中读取数据时session,我之前通过的一些数据丢失了。

代码:

/pages/api/auth/[...nextauth.js]

export default (req, res) => 
    NextAuth(req, res, {
        providers: [
            Providers.Credentials({
                name: 'Credentials',
                credentials: {
                    phone: { label: "Phone number", type: "text" },
                    password: { label: "Password", type: "password" }
                },
                authorize: async (loginData) => {
                    const { csrfToken, phone, password } = loginData;
                    
                    //  checking if there is account with these credentials
                    let res = await login({
                        phone, 
                        password: sha1(md5(password)).toString()
                    })

                    //  200 = OK
                    if(res.status == 200){
                        //  collect account data
                        const user = {
                            phone,
                            ...res.data.info
                        }

                        //  user object is created correctly, whole data is stored there
                        console.log('received account data from firestore', user)
                        return Promise.resolve(user);
                    }
                    else {
                        //  wrong credentials
                        return Promise.resolve(null);
                    }
                }
            })
        ],
        callbacks: {
            session: async (session, user) => {
                console.log('data passed to object when signed in', user)
                //  user object there doesn't have all data passed before
                return Promise.resolve(session)
            }
        },
        debug: false
    })
Run Code Online (Sandbox Code Playgroud)

控制台记录的对象:

received account data from firestore 
{
  phone: '123123123',
  id: 'w2zh88BZzSv5BJeXZeZX',
  email: 'jan@gmail.com',
  name: 'Jan',
  surname: 'Kowalski'
}
Run Code Online (Sandbox Code Playgroud)
data passed to object when signed in 
{
  name: 'Jan',
  email: 'jan@gmail.com',
  iat: 1603900133,
  exp: 1606492133
}
Run Code Online (Sandbox Code Playgroud)

最好的是,对象(上面)总是具有相同的属性。我可以在authorize回调中传递任何对象,但在sessionuser对象总是有“姓名,电子邮件,iat,exp”总是。唯一改变的是对象(名称,电子邮件)中这两个属性的值。(其余属性 - “电话,身份证,姓氏” - 缺失)。

下面有session任何反应组件中的控制台记录对象:

import {
    signIn, 
    signOut,
    useSession
} from 'next-auth/client'

const [ session, loading ] = useSession();
console.log(session)
Run Code Online (Sandbox Code Playgroud)

控制台记录的会话对象的照片

我能做什么?我是否必须firestoresession回调中单独接收数据?是服务端渲染Next.js导致的问题吗?

Mat*_*ski 20

我自己解决了这个问题。
这个问题线程帮助了我很多!
https://github.com/nextauthjs/next-auth/issues/764

下面是解释:

callbacks: {
    jwt: async (token, user, account, profile, isNewUser) => {
        //  "user" parameter is the object received from "authorize"
        //  "token" is being send below to "session" callback...
        //  ...so we set "user" param of "token" to object from "authorize"...
        //  ...and return it...
        user && (token.user = user);
        return Promise.resolve(token)   // ...here
    },
    session: async (session, user, sessionToken) => {
        //  "session" is current session object
        //  below we set "user" param of "session" to value received from "jwt" callback
        session.user = user.user;
        return Promise.resolve(session)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这是一个很好的引导。如今,签名看起来更像是“session: async (session, user) => {”。另外,由于您使用的是“async”,您可以只返回“session”,因此不需要使用“Promise.resolve”。 (2认同)