はじめに (対象読者・この記事でわかること)

この記事は、Flutterでモバイルアプリケーションを開発しており、Google Sign-In認証の実装に挑戦されている開発者の方を対象としています。特に、iOSビルドでのみ「Error 400: invalid_request」というエラーに遭遇し、原因特定に苦労されている方のお役に立てる内容となっています。

この記事を読むことで、以下のことがわかるようになります。

  • iOS版Google Sign-In認証でError 400: invalid_requestが発生する主な原因
  • FirebaseコンソールやGoogle Cloud Consoleでの確認すべき設定項目
  • iOSのInfo.plistおよびGoogleService-Info.plistの設定手順
  • 上記エラーを解決するための具体的な手順と確認ポイント

Flutterにおけるクロスプラットフォーム開発の魅力の一つに、共通のコードベースで複数のプラットフォームに対応できる点があります。しかし、プラットフォーム固有の設定が原因で予期せぬ問題が発生することもしばしばです。本記事では、そういった開発者が直面しやすい「iOS版Google Sign-Inのエラー」に焦点を当て、その解決の糸口を提供します。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。

  • Flutterの基本的な開発環境が構築できていること。
  • Firebase Authenticationを利用したGoogle Sign-Inの実装経験があること。(または、実装を試みていること)
  • iOS開発におけるplistファイル(Info.plist)の基本的な理解。

iOS版Google Sign-InでError 400: invalid_requestが発生する背景

Google Sign-Inは、ユーザーにGoogleアカウントでのサインインを可能にする便利な認証方法です。Flutterでは、google_sign_inパッケージなどを利用して簡単に実装できますが、環境によっては特定のプラットフォームで問題が発生することがあります。

「Error 400: invalid_request」は、Google認証サーバーからの応答で、リクエストに含まれるパラメータが無効である、または認証フローに問題があることを示唆しています。iOS版でこのエラーが頻発するケースでは、主に以下のような原因が考えられます。

  1. Google Cloud Consoleでの設定不備:
    • OAuth 2.0 クライアント ID の設定ミス。
    • iOS アプリの Bundle ID が正しく登録されていない、または一致しない。
    • SHA-1 フィンガープリントの設定(Android向けであり、iOSでは直接関係ありませんが、設定項目として存在するため混同しやすい)。
  2. Firebaseプロジェクトの設定不備:
    • FirebaseプロジェクトのiOSアプリ設定で、Bundle ID が正しく登録されていない、または一致しない。
    • GoogleService-Info.plist ファイルのダウンロードや配置ミス。
  3. google_sign_in パッケージの初期化設定:
    • GoogleSignIn インスタンスの初期化時に、iosClientId の設定が正しく行われていない。
    • Info.plist ファイルでのURLスキームの設定ミス。

これらの設定項目は、Android版とiOS版でそれぞれ独立した設定が必要となる場合があり、その違いを理解せずに一律の設定を行ってしまうと、iOS版のみでエラーが発生する原因となります。特に、google_sign_inパッケージは、内部的にGoogle APIクライアントライブラリを利用しており、これらのクライアントライブラリがプラットフォーム固有の設定を必要とするため、設定漏れや不一致がエラーを引き起こしやすいのです。

Error 400: invalid_request の原因特定と解決策

このセクションでは、Error 400: invalid_request の具体的な原因特定方法と、それぞれの解決策を詳細に解説します。

1. Google Cloud Console の設定確認

まず、Google Cloud ConsoleでのOAuth 2.0 クライアント ID の設定を確認します。

手順:

  1. Google Cloud Console にアクセス: https://console.cloud.google.com/ にアクセスし、該当するプロジェクトを選択します。
  2. 「APIとサービス」 > 「認証情報」 へ移動: 左側のナビゲーションメニューから「APIとサービス」を選択し、その中の「認証情報」をクリックします。
  3. OAuth 2.0 クライアント ID の確認:
    • 「OAuth 2.0 クライアント ID」のリストを確認します。
    • 「iOS クライアント」または「Web アプリケーション」として作成されたクライアント ID を見つけます。(通常、FlutterのGoogle Sign-In実装では、google_sign_inパッケージが内部で利用するため、Web アプリケーションとして作成したクライアント ID を使用することが多いですが、iOS専用のクライアントIDが設定されている場合もあります。)
    • Bundle ID の一致:
      • 選択したクライアント ID の詳細を開きます。
      • 「認証情報」または「対象のプラットフォーム」といった項目の中に、登録されている Bundle ID が表示されています。
      • この Bundle ID が、Firebaseプロジェクトに登録されているiOSアプリのBundle ID および Xcode プロジェクトの Bundle Identifier と完全に一致していることを確認してください。大文字・小文字の違いも厳密にチェックしましょう。
      • もし一致していない、または登録されていない場合は、新しいクライアント ID を作成するか、既存のクライアント ID の設定を編集して正しい Bundle ID を追加してください。
    • Client ID の確認:
      • Google Cloud Console で取得した Client ID (例: 1234567890-abcdefghijklmnopqrstuvwxyz12345678.apps.googleusercontent.com) を控えておきます。この Client ID は、後ほど Flutter コードで使用します。

ハマった点やエラー解決:

  • Android版ではSHA-1フィンガープリントが必須ですが、iOS版ではBundle IDが最も重要です。SHA-1フィンガープリントをiOSクライアントIDに設定してしまうと、むしろ問題が発生する可能性があります。iOSクライアントIDには、Bundle IDのみを設定するように注意してください。
  • 複数のGoogle Cloudプロジェクトで作業している場合、意図しないプロジェクトの設定を確認していないか注意しましょう。

2. Firebase プロジェクトの iOS アプリ設定確認

次に、FirebaseコンソールでのiOSアプリ設定を確認します。

手順:

  1. Firebase コンソールにアクセス: https://console.firebase.google.com/ にアクセスし、該当するプロジェクトを選択します。
  2. 「プロジェクト設定」 > 「アプリ」 へ移動: 左側のメニューから「プロジェクト設定」を選択し、「アプリ」タブをクリックします。
  3. iOS アプリの設定確認:
    • 登録されているiOSアプリのリストを確認します。
    • Bundle ID:
      • 登録されているiOSアプリの Bundle ID が、Google Cloud Console で確認したもの、および Xcode プロジェクトの Bundle Identifier と完全に一致していることを確認してください。
    • GoogleService-Info.plist のダウンロードと配置:
      • Firebaseコンソールから GoogleService-Info.plist ファイルをダウンロードします。
      • このファイルは、Xcode プロジェクトのルートディレクトリに配置する必要があります。
      • Flutter プロジェクトの ios ディレクトリ直下に配置すると、Xcode が自動的に認識してくれます。
      • 配置方法: Xcode で iOS プロジェクトを開き(ios/Runner.xcworkspace)、Project Navigator で Runner を選択し、TARGETS の Runner を選択します。Build Settings の "Info.plist File" で、GoogleService-Info.plist が正しく指定されているか確認します。

ハマった点やエラー解決:

  • GoogleService-Info.plist ファイルが古かったり、ダウンロードし直していない場合、最新の設定が反映されていない可能性があります。
  • GoogleService-Info.plist ファイルを Xcode プロジェクトに追加する際に、「Copy items if needed」にチェックを入れ、Target membership で Runner にチェックが入っていることを確認してください。

3. Flutter コード内の google_sign_in パッケージ設定

最後に、Flutterコード内の google_sign_in パッケージの設定を確認します。

手順:

  1. google_sign_in パッケージの初期化: main.dart ファイルなどのエントリーポイントで、GoogleSignIn インスタンスを初期化する箇所を確認します。 ```dart import 'package:google_sign_in/google_sign_in.dart';

    final GoogleSignIn googleSignIn = GoogleSignIn( // Android 用 client ID は設定不要 // iOS 用 client ID を指定 // OAuth 2.0 client ID (Google Cloud Console で取得したもの) // Web アプリケーションとして作成した client ID を指定することが多い iosClientId: 'YOUR_IOS_CLIENT_ID.apps.googleusercontent.com', // ここに Google Cloud Console で取得した Client ID を設定 // 他のスコープ設定など... scopes: [ 'email', 'https://www.googleapis.com/auth/contacts.readonly', ], ); `` *iosClientId: ここに、**Google Cloud Console で取得した OAuth 2.0 クライアント ID** を正しく設定します。前述の通り、通常は「Web アプリケーション」として作成したクライアント ID を指定します。 2. **Info.plistファイルの URL スキーム設定**: *ios/Runner/Info.plistファイルを開きます。 *CFBundleURLTypesというキーの中に、Google Sign-In 用の URL スキームが設定されていることを確認します。 * これは、google_sign_inパッケージが推奨する形式で、通常は **com.googleusercontent.apps.** の形式になります。の部分は、Google Cloud Console で取得した Client ID の **apps.googleusercontent.com** より前の部分に置き換えます。 * 例: Client ID が1234567890-abcdefghijklmnopqrstuvwxyz12345678.apps.googleusercontent.comの場合、URL スキームはcom.googleusercontent.apps.1234567890-abcdefghijklmnopqrstuvwxyz12345678` となります。

    xml <key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleTypeRole</key> <string>Editor</string> <key>CFBundleURLName</key> <string>com.example.yourAppName</string> <!-- 任意 --> <key>CFBundleURLSchemes</key> <array> <string>com.googleusercontent.apps.YOUR_WEB_CLIENT_ID_WITHOUT_DOT_APPS</string> <!-- 必要であれば、他のURLスキームも追加 --> </array> </dict> </array> 重要: YOUR_WEB_CLIENT_ID_WITHOUT_DOT_APPS の部分は、Google Cloud Console で取得した Client ID から .apps.googleusercontent.com の部分を取り除いた文字列(例: 1234567890-abcdefghijklmnopqrstuvwxyz12345678)に置き換えてください。

ハマった点やエラー解決:

  • iosClientId を正しく指定していないと、Google認証サーバーとの通信が正常に行われず、Error 400が発生します。
  • Info.plist の URL スキーム設定は、Google認証からのコールバックを受け取るために非常に重要です。この設定が誤っていると、認証フローが完了せず、エラーとなります。com.googleusercontent.apps. のプレフィックスを忘れないようにしてください。
  • Flutter 3.x 以降では、Swift Package Manager (SPM) を使用して Google Sign-In を設定する場合もあり、その場合は GoogleService-Info.plist の設定方法や URL スキームの設定方法が若干異なることがあります。公式ドキュメントを参照してください。
  • google_sign_in パッケージのバージョンが古い場合、最新の Google API との互換性に問題がある可能性があります。最新バージョンへのアップデートを検討してください。

4. Xcode でのクリーンと再ビルド

上記の設定を確認・修正しても問題が解決しない場合は、Xcode のキャッシュが原因である可能性も考えられます。

手順:

  1. Xcode のクリーン:
    • Product > Clean Build Folder を選択します(Shift + Command + K)。
  2. Derived Data の削除:
    • Xcode > Preferences (または Settings) > Locations を開きます。
    • Derived Data のパスが表示されているので、そのフォルダをFinderで開き、中身をすべて削除します。
  3. 再度ビルド:
    • Flutter プロジェクトのルートディレクトリで flutter clean を実行します。
    • その後、flutter run または Xcode から再度ビルドを実行します。

まとめ

本記事では、FlutterでiOS版Google Sign-In認証時に発生する「Error 400: invalid_request」の原因と解決策について、詳細に解説しました。

  • Error 400: invalid_request は、Google Cloud Console、Firebaseプロジェクト、Flutterコードのいずれかの設定不備によって発生することが多い。
  • 特に、Google Cloud Console の OAuth 2.0 クライアント ID における iOS アプリの Bundle ID 設定Firebase プロジェクトへの iOS アプリ登録と GoogleService-Info.plist の配置、そして Flutter コード内の iosClientId および Info.plist の URL スキーム設定 が重要である。
  • これらの設定項目を注意深く確認し、一貫性を持たせることが、問題解決の鍵となる。

この記事を通して、iOS版Google Sign-Inのエラーに悩んでいた開発者の方々が、自信を持って認証機能を実装できるようになることを願っています。今後は、他のプラットフォーム固有の認証問題や、より高度な認証フローについても記事にする予定です。

参考資料