セッションの拡張
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.dokyumento.jp/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
コールバックはプロバイダーからのユーザープロファイル情報を公開します。これを利用して、JWTトークンにユーザーIDを追加できます。その後、この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.dokyumento.jp/getting-started/typescript) on how to add it.
callbacks: {
session({ session, user }) {
session.user.id = user.id
return session
},
}
}
これにより、セッションオブジェクトにユーザーIDが追加されます。この場合、IDはtoken
オブジェクトではなく、user
オブジェクトから取得していることに注意してください。データベースセッション戦略では、user
オブジェクトはデータベースからのユーザーであり、token
はありません。
auth()
またはuseSession()
の呼び出しで、ユーザーIDにアクセスできるようになります。
セッションオブジェクトは、データベースセッションを使用している場合でも、サーバー側に永続化されません。セッションテーブルには、セッショントークン(ID)、ユーザー、有効期限などのデータのみが格納されます。セッションデータをサーバー側に永続化する必要がある場合は、別の場所に保存する必要があります。 session()
コールバックでデータベースに接続して、この情報を取得できます。
プロバイダー関数を使用する場合
デフォルトのセッションデータを拡張する方法はいくつかあり、そのうちの1つは`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 }
},
}),
]