Oteto Blogのロゴ

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が設定される模様。