NextAuth x AppleProvider x Firebaseでの認証実装ハマリポイント

副業先でこれらで認証実装したのだけれど、この組み合わせはあまり情報としてないため誰かのためにここに残しておく
WIP

FirebaseError: Firebase: Error (auth/unauthorized-domain).
signinボタンを押すとfirebaseが一瞬立ち上がって閉じられる現象
firebase側でドメインが承認されていないので拒否されています
firebaseの
Authentication -> settings -> 承認済みドメイン -> ドメインの追加で追加します
追加されました
立ち上がりました
Firebase: Error (auth/operation-not-allowed).
前提
- apple developerサイトに入れる、チームまたは個人が年間のdeveloper会費を支払っていてメンバーになっている
- firebaseのプロジェクトは作ってある
- NextAuthの方のでのsign inの実装は済んでいる
- 環境変数
APPLE_CLIENT_SECRET
は作れていること
けどわからない方向け
signInWithPopup(auth, appleProvider).then((result) => {
// The signed-in user info.
const user = result.user;
// Apple credential
const credential = OAuthProvider.credentialFromResult(result);
if(credential === null){
throw new Error("no credential")
}
const accessToken = credential.accessToken;
const idToken = credential.idToken;
// IdP data available using getAdditionalUserInfo(result)
// ...
signInByNextAuth('credentials', { idToken, callbackUrl: '/' });
})
.catch((error) => {
// Handle Errors here.
const errorCode = error.code;
const errorMessage = error.message;
// The email of the user's account used.
const email = error.customData.email;
// The credential that was used.
const credential = OAuthProvider.credentialFromError(error);
console.log({errorCode, errorMessage, email, credential})
});
ここのconsoleで
Firebase: Error (auth/operation-not-allowed).
がでた場合
firebaseのここ
とApple developerサイトの
アカウント -> 証明書、ID、プロファイル -> Id(英語) -> Certificates, Identifiers & Profiles -> 右の方「AppIDs(虫眼鏡) 」 -> Services IDs -> Service ID for Sign In with Apple Id -> Identifier
https://developer.apple.com/account/resources/identifiers/serviceId/edit/<hoge>
にある
ここ
があっていない可能性があります
また、省略可能となっているここら辺全て埋める必要があります
server 起動時に読み込む環境変数
APPLE_ID=<hogehoge>
APPLE_ID=hoge
APPLE_CLIENT_SECRET=-----BEGIN PRIVATE KEY-----
some
-----END PRIVATE KEY-----
APPLE_TEAM_ID=hoge
APPLE_KEY_ID=hoge
も同じ値です
これらが権限関係で見えない、わからない場合は
管理者と連絡を取って実装者が埋める必要があります

invalid_request redirect_uri is required
今回ハマったところ。NextAuth x Firebase x Apple認証のリソースが少ないので苦労した
調査すると誰もが間違えているポイントがある
Apple developer側のServices IDsの設定
- domainに
https://
書くな - return urlsには最後 / 書くな
- serviceIdとappIdを間違えるな
が多い
serviceIDを設定する時保存されているか注意
- continues
- save
設定したはずなのに変更されていない!となった...
ありとあらゆるリソースを参考にした
- Sign In With Apple JS returns 'invalid_request: Invalid redirect_uri.'
- Apple auth problem
- Getting error "invalid_request: Invalid web redirect url" when using Apple ID sign-in with Firebase
-
これらはちゃんと確認して問題ないことがわかった
TLS1.2以上をサポートしているのか調べた
redirect設定は複数できることを知る
このリンク先で配列で持てることを知った: Add a redirect URI to a login clientひょっとしたらNextAuthでも?と思ったらclient
に redirect_urls
を持っていることを知った
先ほどのserviceKeyにfirebaseのhander以外に指定でき、そこにNextAuthのコールバック設定をする

error=OAuthSignin
が付与される
callbackにparameter NEXTAUTH_JWT_SECRET
を設定してみる
ランダムな文字列ならなんでもいい
jwt: {
secret: process.env.NEXTAUTH_JWT_SECRET
}

invalid_request Invalid web redirect url.
nextAuthではprovider設定からここの記述で上書きできる
AppleProvider({
client: {
redirect_uris: [
'/login/callback' // here
]
},
authorization: {
params: {
scope: 'name email',
response_mode: 'form_post',
response_type: 'code'
}
},
clientId: process.env.NEXT_PUBLIC_APPLE_SERVICE_ID!,
clientSecret: process.env.APPLE_CLIENT_SECRET!
}),
to
AppleProvider({
client: {
redirect_uris: [
'<your NEXT_PUBLIC_NEXTAUTH_URL>/login/callback'
]
},
authorization: {
params: {
scope: 'name email',
response_mode: 'form_post',
response_type: 'code'
}
},
clientId: process.env.NEXT_PUBLIC_APPLE_SERVICE_ID!,
clientSecret: process.env.APPLE_CLIENT_SECRET!
}),

appleProviderでredirectUrlの最後にerror=CredentialsSigninが付く問題
- signInByNextAuth('credentials', { idToken});
+