Closed1

FlutterにおけるプラットフォームごとのGoogle認証方法まとめ

ツルオカツルオカ

プラットフォームごとに処理が異なるためメモを残しておく。
WebやDesktopではクライアントIDの承認済みドメイン(ホワイトリスト)やリダイレクトURIの指定が別途必要(そのため、Webでの開発はポート番号固定での起動がおすすめ flutter run -d chrome --web-port=5000)。

iOS/Android

  • 普通にgoogle_sign_in | Flutter Packageを使えば良い
  • v5.4.0からiOSでのGoogleService-Info.plist指定が不要になった(=設定不要になった)
  • Androidの場合はSHA-1の登録が必要(Firebaseコンソール)
  • 設定が済んでいるのにもかかわらずうまく動作しない場合、iOSもAndroid両方ともネイティブ起動すれば、詳細のログがでてきて原因特定しやすい
    • 例: iOSで認証ボタン押下時にアプリがKillされる→Xcode経由で起動するとREVERSE_CLIENT_IDが間違っているとのログが出力

Web

  • モバイル同様google_sign_in | Flutter Packageを使えば良いが、依存関係にあるgoogle_sign_in_web | Flutter Packageが実際は機能しているので、詳細は後者のREADMEを見るのが良い。
  • google_sign_in_webのREADMEにも記載されているが、v0.12からGIS(Google Identity Services)方式に変更となっている
    • Authentication(認証)とAuthorization(認可)が明確に区別された
  • signInSilentlyメソッドで認証する必要がある
    • signInメソッドではIdTokenが取得できない点に注意
    • これ単体ではIdTokenの取得はできるもののaccessTokenが取得できない点に注意
  • accessTokenが必要な場合は、requestScopesメソッドで利用スコープの認可要求が必要
サンプルコード
Future<GoogleSignInAccount?> _signInWithWeb() async {
   final googleSignIn = GoogleSignIn(
   clientId: [YOUR_CLIENT_ID],
   );

   // 定義したスコープで認可リクエスト
   final res = await googleSignIn.requestScopes([
   'email',
   'https://www.googleapis.com/auth/userinfo.profile',
   ]);
  
   // 認証
   return res ? googleSignIn.signInSilently() : null;
}
signInSilently()の挙動

Desktop(macOS)

このスクラップは2023/10/16にクローズされました