next-authでメールアドレスを小文字に変換してる件を調査してみる
個人開発で、メールアドレスが大文字→小文字に変換されてて困ったので記録として残しておこう
環境
Next.js: 12.1.6
next-auth: 4.10.3
IDP: AAD B2C
何が起きた?
AAD で連絡先メールアドレスとしてSAMPLE@example.com
を登録した
すると、jwtのペイロードでは、連絡先メールアドレス + ユーザープリンシパルが返される
ここまでは想定通り
next-authのコードで、次のようなコードを書いてみることとする。
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の値がこうなるのは想定通り
next-authのコードを確認していく
まずは、AADのProviderがどうかを見てみる
AAD B2C用のプロバイダーでは変換はしてなさそうに見える
ドキュメントにもemailについては書いてなさそう
githubのissueを見てみる
lower caseに関する記述があるなー
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.
lowercaseに変換するコードはsigninの中に存在するということが分かった
が、よく見てみると、これはprovider typeがemailの場合のコードだ
今回はoauthなので、toLowerCaseされているところを中心に見てみる
oauthで使われるcallbackでemailを小文字にしてる
で、これがcallbackで使われている
結局 /callbackが呼び出されたときに、メールアドレスが変換されていそうということが分かった
oauthのコードではないが、email認証のコードコメントなんかを見る限り、next-authでは、case insensitiveでメールアドレスを扱うことを推奨していそうな感じがある
後で、ダメもとでissueを作ってみるか
discussionにとりあえず投げといた