タイトルのとおりです。
FlutterでFirebaseを利用したAppleサインインをしようとしたところ、ずーっと[firebase_auth/invalid-credential] Invalid OAuth response from apple.com
のエラーが発生していました。
なまじ認証には成功しているのでApple Developer側のミスなのか、Firebase側のミスなのか、Xcodeのミスなのかコードの間違いなのかが判別つかずものすごく苦労しました・・・。
基本的にはこちらの記事の通りにやれば問題なしです。
大変参考になりました。ありがとうございます。
ライブラリバージョンの関係なのか(私の理解の問題も多分にありますが)どこかから仕入れたサンプルコードでは動かなかったので解決法を共有です。
バージョン等
$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.22.2, on macOS 14.1.1 23B81 darwin-arm64, locale ja-JP)
[✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
[✓] Xcode - develop for iOS and macOS (Xcode 15.4)
[✓] Android Studio (version 2024.1)
firebase_auth: ^5.1.4
sign_in_with_apple: ^6.1.1
コード
Future<MyApiResponse> signInWithApple() async {
final rawNonce = generateNonce();
final appleCredential = await SignInWithApple.getAppleIDCredential(
scopes: [
AppleIDAuthorizationScopes.email,
AppleIDAuthorizationScopes.fullName,
],
nonce: sha256ofString(rawNonce), // ←追加
);
try {
final credential = OAuthProvider('apple.com').credential(
idToken: appleCredential.identityToken,
rawNonce: rawNonce,
accessToken: appleCredential.authorizationCode, // ←追加
);
UserCredential userCredential = await FirebaseAuth.instance.signInWithCredential(credential);
} on FirebaseAuthException catch (e) {
... エラー処理
}
}
String sha256ofString(String input) {
final bytes = utf8.encode(input);
final digest = sha256.convert(bytes);
return digest.toString();
}
これでいけるはず。
参考:
2024.10.10追記
コメントで「もっと簡単になったよ!」と教えていただき参考サイトをもとにやってみました。
なんとこれだけで実装できました。良い世の中になったものだ。
Future<MyApiResponse> signInWithApple() async {
try {
final appleProvider = AppleAuthProvider();
UserCredential userCredential = await FirebaseAuth.instance.signInWithProvider(appleProvider);
} on FirebaseAuthException catch (e) {
... エラー処理
}
}
※余談
同じやり方でGoogleサインインもやれるのでは!?と思ったのですが
動くは動くのですが(おそらく)いろいろと設定をしないといけないようだったので今回は見送りとしました。
参考: