擴展 Session
Auth.js 函式庫預設只會在 session 中公開使用者資訊的子集,以避免不小心暴露敏感的使用者資訊。這包括 name
、email
和 image
。
所有回呼都是非同步函式,因此您也可以從資料庫或外部 API 取得額外資訊。
一個常見的用例是將使用者的 ID 新增至 session。下面說明如何根據您使用的 session 策略來執行此操作。
使用 JWT
若要存取使用者 ID,請將以下內容新增至您的 Auth.js 設定
// 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
// 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 資料,其中一種是使用 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 }
},
}),
]