Closed9

next-authでメールアドレスを小文字に変換してる件を調査してみる

mongolyymongolyy

個人開発で、メールアドレスが大文字→小文字に変換されてて困ったので記録として残しておこう

環境

Next.js: 12.1.6
next-auth: 4.10.3

IDP: AAD B2C

何が起きた?

AAD で連絡先メールアドレスとしてSAMPLE@example.comを登録した

すると、jwtのペイロードでは、連絡先メールアドレス + ユーザープリンシパルが返される

ここまでは想定通り

next-authのコードで、次のようなコードを書いてみることとする。

[...nextauth].ts
export default NextAuth({
  providers: [
    AzureADB2CProvider({
      tenantId: process.env.AZURE_AD_B2C_TENANT_NAME,
      clientId: process.env.AZURE_AD_B2C_CLIENT_ID,
      clientSecret: process.env.AZURE_AD_B2C_CLIENT_SECRET,
      primaryUserFlow: process.env.AZURE_AD_B2C_PRIMARY_USER_FLOW,
      authorization: { params: { scope: 'offline_access openid' } },
    }),
  ],
  callbacks: {
    async jwt({ token, account }) {
      console.log('at jwt:', token.email)
      return token
    },
    async session({ session, token }) {
      console.log('token at session:', token.email)
      console.log('session at session:', session.user?.email)
      return session
    },
  },
})

ログインしてみると、ターミナルにはこの表示が、、

sample@example.com だと!!(想定だと、SAMPLE@example.com
jwtの結果がsessionに転送されるので、jwtの値がこうなる時点で、sessionの値がこうなるのは想定通り

mongolyymongolyy

githubのissueを見てみる

https://github.com/nextauthjs/next-auth/issues?q=is%3Aissue+lowercase+email

lower caseに関する記述があるなー

https://github.com/nextauthjs/next-auth/issues/287#issuecomment-646946419

It seems like the only consideration is the normalisation of the email address to lowercase - i.e. if there is an email address property, it should be lowercased - and if we need to move that logic somewhere else, maybe ~ line 40 of next-auth/src/server/routes/callback.js?

I left a comment on the sign up page on why I lower case it, even though it's technically against the RFC 2821 - basically this is not how email address work in practice and nobody wants to accidentally end up with two email accounts because they typed in 'joe@example.com' instead of joe@example.com.

mongolyymongolyy

結局 /callbackが呼び出されたときに、メールアドレスが変換されていそうということが分かった

oauthのコードではないが、email認証のコードコメントなんかを見る限り、next-authでは、case insensitiveでメールアドレスを扱うことを推奨していそうな感じがある

このスクラップは2023/01/22にクローズされました