跳至內容
從 NextAuth.js v4 遷移?請閱讀 我們的遷移指南.
指南擴展 Session

擴展 Session

Auth.js 函式庫預設只會在 session 中公開使用者資訊的子集,以避免不小心暴露敏感的使用者資訊。這包括 nameemailimage

所有回呼都是非同步函式,因此您也可以從資料庫或外部 API 取得額外資訊。

一個常見的用例是將使用者的 ID 新增至 session。下面說明如何根據您使用的 session 策略來執行此操作。

使用 JWT

若要存取使用者 ID,請將以下內容新增至您的 Auth.js 設定

auth.ts
  //  By default, the `id` property does not exist on `token` or `session`. See the [TypeScript](https://authjs.dev.org.tw/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 Token。然後,在後續呼叫此 API 時,將可以透過 token.id 存取使用者 ID。接著,若要在實際的 session 中公開使用者 ID,您可以存取 session 回呼中的 token.id,並將其儲存至 session.user.id

現在,呼叫 auth()useSession() 將可以存取使用者 ID。

使用資料庫

如果您使用的是資料庫 session 策略,您可以透過修改 session 回呼,將使用者 ID 新增至 session

auth.ts
  //  By default, the `id` property does not exist on `session`. See the [TypeScript](https://authjs.dev.org.tw/getting-started/typescript) on how to add it.
  callbacks: {
    session({ session, user }) {
      session.user.id = user.id
      return session
    },
  }
}

這會將使用者 ID 新增至 session 物件。請注意,在這種情況下,我們是從 user 物件取得 ID,而不是 token。使用資料庫 session 策略時,user 物件是來自資料庫的使用者,且沒有 token

現在,呼叫 auth()useSession() 將可以存取使用者 ID。

⚠️

session 物件不會在伺服器端持續保存,即使在使用資料庫 session 時也是如此 — 只有 session Token (ID)、使用者和過期時間等資料會儲存在 session 資料表中。如果您需要在伺服器端持續保存 session 資料,則必須將其儲存在其他地方。您可以在 session() 回呼中連線至資料庫以擷取此資訊。

使用提供者函式

我們可以使用多種方式來擴展預設的 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