シチュエーション
ある日、これまで利用できていたAppleIDを利用した認証機能が利用できなくなった。
AppleIDを利用して認証するユーザーはサービスを利用することができない。
早期に問題の解決を求められる。
- ログインをしていないため、UserIDでログを絞り込むことができない
- Appleのシステム状況は問題発生していない
- Twitterなどを見てもAppleIDでログインできないサービスは複数ある様子
なぜ、認証機能がうまく動作しないのだろうか?
問題箇所
email_verified
A string or Boolean value that indicates whether the service verifies the email. The value can either be a string ("true" or "false") or a Boolean (true or false). The system may not verify email addresses for Sign in with Apple at Work & School users, and this claim is "false" or false for those users.(email_verified
Goolgle翻訳:サービスが電子メールを検証するかどうかを示す文字列またはブール値。値は文字列( "true" or "false") またはブール値 (trueまたはfalse) のいずれかです。システムは、職場および学校で Apple でサインインするユーザーの電子メール アドレスを検証できない可能性があり、この申し立てはそれらのユーザーを"false"対象としていますfalse。)
AppleIDは公式ドキュメント
email_verifiedの値は、文字列( "true" or "false") またはブール値 (trueまたはfalse) のいずれかです。
どちらか一方しか対応していなかった場合、認証時にエラーが発生してしまいます。
解決
stringとBooleanの両方に対応する
func (p *appleAuthProfile) GetEmailVerified() (bool, bool) {
// email_verifiedがない場合はfalseとする
v, ok := p.claims["email_verified"]
if !ok {
return false, false
}
// email_verifiedはstringまたはboolで返ってくる
switch v := v.(type) {
case bool:
return v, true
case string:
return v == "true", true
default:
return false, false
}
}
おわりに
Twitterなどを見てもAppleIDでログインできないサービスは複数ある状況だったため、これはApple側の障害に違いないと結論づけたくなる。
しかし、ログと公式ドキュメントを辿ると実装ミスであることがわかった。