扩展会话
Auth.js 库默认只在会话中公开用户部分信息,以避免意外泄露敏感的用户数据。这些信息包括 name
、email
和 image
。
所有回调都是异步函数,因此您也可以从数据库或外部 API 获取额外信息。
一个常见的用例是将用户的 ID 添加到会话中。以下将根据您使用的会话策略展示如何操作。
使用 JWT
要访问用户 ID,请将以下内容添加到您的 Auth.js 配置中
// By default, the `id` property does not exist on `token` or `session`. See the [TypeScript](https://authjs.oauth.ac.cn/getting-started/typescript) on how to add it.
callbacks: {
jwt({ token, user }) {
if (user) { // User is available during sign-in
token.id = user.id
}
return token
},
session({ session, token }) {
session.user.id = token.id
return session
},
},
}
在登录期间,jwt
回调会公开来自提供商的用户配置文件信息。您可以利用这一点将用户的 ID 添加到 JWT 令牌中。然后,后续调用此 API 将可以通过 token.id
访问用户的 ID。然后,为了在实际会话中公开用户的 ID,您可以在 session
回调中访问 token.id
并将其保存到 session.user.id
中。
对 auth()
或 useSession()
的调用现在将能够访问用户的 ID。
使用数据库
如果您使用的是数据库会话策略,您可以通过修改 session
回调将用户的 ID 添加到会话中
// By default, the `id` property does not exist on `session`. See the [TypeScript](https://authjs.oauth.ac.cn/getting-started/typescript) on how to add it.
callbacks: {
session({ session, user }) {
session.user.id = user.id
return session
},
}
}
这会将用户的 ID 添加到会话对象中。请注意,在这种情况下,我们是从 user
对象而不是 token
中获取 ID。在数据库会话策略中,user
对象是来自数据库的用户,并且没有 token
。
对 auth()
或 useSession()
的调用现在将能够访问用户的 ID。
即使使用数据库会话,会话对象也不会在服务器端持久保存 - 只有会话令牌 (ID)、用户和过期时间等数据存储在会话表中。如果您需要在服务器端持久保存会话数据,您必须将其保存到其他地方。您可以连接到 session()
回调中的数据库以检索此信息。
使用提供商函数
我们可以通过多种方式扩展默认的会话数据,其中一种是使用 authorize
和 profile
函数。这些函数允许我们返回一个包含所需属性的用户对象。然后,我们可以根据此信息创建逻辑以在数据库或外部 API 中进行搜索。
import Github from "next-auth/providers/github"
import Credentials from "next-auth/providers/credentials"
import type { Provider } from "next-auth/providers"
const providers: Provider[] = [
Google({
clientId: process.env.AUTH_GOOGLE_ID,
clientSecret: process.env.AUTH_GOOGLE_SECRET,
async profile(profile) {
return { ...profile }
},
}),
Credentials({
async authorize(credentials) {
return { ...credentials }
},
}),
]