NextAuth (Auth.js) でJWTトークンからuserIdを取得しセッションに含める

const authConfig = {
// ...
session: { strategy: 'jwt' },
callbacks: {
// ...
async session({ session, user }): Promise<Session> {
console.log(user); // => undefined
return session;
},
},
} satisfies NextAuthConfig;

NextAuth (Auth.js v5)でセッションにuserIdを含めたいことがある。

しかしデータベースセッションとは異なり、JWTの場合はsessionコールバックで渡されるuserundefinedになってしまう。

解決法

const authConfig = {
// ...
session: { strategy: 'jwt' },
callbacks: {
// ...
async session({ session, token: { sub } }): Promise<Session> {
if (session.user && sub) session.user.id = sub;
return session;
},
},
} satisfies NextAuthConfig;

userではなくtoken.subからuserIdを取得できた。

{
"name": "xxx",
"email": "xxx",
"picture": "xxx",
"sub": "xxx",
"iat": xxx,
"exp": xxx,
"jti": "xxx"
}

というのもtokenがJWTのペイロード情報のようで、subプロパティにuserIdが設定される模様。