跳至内容
从 NextAuth.js v4 迁移?阅读 我们的迁移指南.
指南扩展会话

扩展会话

Auth.js 库默认只在会话中公开用户部分信息,以避免意外泄露敏感的用户数据。这些信息包括 nameemailimage

所有回调都是异步函数,因此您也可以从数据库或外部 API 获取额外信息。

一个常见的用例是将用户的 ID 添加到会话中。以下将根据您使用的会话策略展示如何操作。

使用 JWT

要访问用户 ID,请将以下内容添加到您的 Auth.js 配置中

auth.ts
  //  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 添加到会话中

auth.ts
  //  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() 回调中的数据库以检索此信息。

使用提供商函数

我们可以通过多种方式扩展默认的会话数据,其中一种是使用 authorizeprofile 函数。这些函数允许我们返回一个包含所需属性的用户对象。然后,我们可以根据此信息创建逻辑以在数据库或外部 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 }
    },
  }),
]

资源

Auth.js © Balázs Orbán 和团队 -2024