登录后在哪里以及如何更改会话用户对象?
我有个奇怪的问题,我不知道问题出在哪里。我使用next-auth库在Next.js
应用中创建身份验证系统。
google firebase
中是否有已提交凭据的帐户进行登录,session
正在正确创建,但是当authorize
回调初始化时,我会在正确登录后传递从google firestore
接收的数据。User对象包含整个数据,并向前传递。
然后,当我要从session
读取数据时,我以前传递的某些数据丢失。
编码:
/ages/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";。唯一更改的是Object(名称、电子邮件)中这两个属性的值。(缺少睡觉属性-电话、ID、姓氏和)。
下面的任何反应组件中都有控制台记录的session
对象:
import {
signIn,
signOut,
useSession
} from 'next-auth/client'
const [ session, loading ] = useSession();
console.log(session)
Photo of console logged session object
我能做些什么?我是否必须在session
回调中分别从firestore
接收数据?是Next.js
的服务器端呈现导致了问题吗?
解决方案
我自己解决了该问题。
这个问题帖子帮了我很大的忙!
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)
}
}
编辑:由于下一次身份验证更新到v4
NextAuth版本4对上面所示的回调进行了一些更改。现在只有一个参数分配给jwt
和session
函数。但是,您可以destructure将其分隔变量。代码的睡觉保持不变。
https://next-auth.js.org/configuration/callbacks#jwt-callback
https://next-auth.js.org/configuration/callbacks#session-callback
// api/auth/[...nextauth].js
...
callbacks: {
jwt: async ({ token, user }) => {
user && (token.user = user)
return token
},
session: async ({ session, token }) => {
session.user = token.user
return session
}
}
...