2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Flutter】Firebaseを利用したApple Sign Inに失敗しまくった話

Last updated at Posted at 2024-10-06

タイトルのとおりです。
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サインインもやれるのでは!?と思ったのですが
動くは動くのですが(おそらく)いろいろと設定をしないといけないようだったので今回は見送りとしました。

参考:

2
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?