我有一个问题,但不确定问题的来源。在我的
Next.js
应用中使用next-auth库来创建认证系统。
一切都很好-我可以通过检查是否有带有提交凭据的帐户在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
})
控制台记录的对象:
received account data from firestore
{
phone: '123123123',
id: 'w2zh88BZzSv5BJeXZeZX',
email: 'jan@gmail.com',
name: 'Jan',
surname: 'Kowalski'
}
data passed to object when signed in
{
name: 'Jan',
email: 'jan@gmail.com',
iat: 1603900133,
exp: 1606492133
}
最好的是,上面的对象始终具有相同的属性。我可以在authorize
回调中传递任何对象,但在session
和user
对象中,始终具有“name,email,iat,exp”属性。唯一变化的是对象中这两个属性的值(即name,email)。 (其余属性 - “phone,id,surname”-缺失)。
下面是在任何React组件中记录在控制台的session
对象:
import {
signIn,
signOut,
useSession
} from 'next-auth/client'
const [ session, loading ] = useSession();
console.log(session)
我该怎么办?我是否需要在session
回调函数中单独从firestore
接收数据?是Next.js
的服务器端渲染导致了问题吗?