FlutterでFirebaseAuthentication[Google認証]を使う

はじめに

flutterプロジェクトにてFirebaseに関する設定ができている前提で話を進めます。まだ、Firebaseの設定や設定ファイルの配置等終わってない場合は、先にこちらの連続記事を参考に準備してください。

準備が終わっている方は早速やってみましょう。

FirebaseAuthentication、Google認証を有効にする

Firebaseの管理画面にて、Authenticationを有効にし、Google認証を有効にしてください。その際、プロジェクト名とメールアドレスを設定する必要がありますが、これは実際にユーザが認証する際に表示されるみたいです。

pubspec.yamlに追加

次はflutter側の編集です。pubspec.yamlを開いてパッケージを追加しましょう。

dependencies: 
  flutter: 
    sdk: flutter 
  firebase_core: 
  firebase_auth: 
  google_sign_in:

上記がFirebaseAuthentication利用時に必要な物です。VSCodeであれば保存すると自動でパッケージを取得してくれます。他の環境やうまくいかない人はターミナルでflutter pub getしてください。

[iOS]info.plistの編集

先にiOSに必要な作業を行います。info.plistを開き、下記内容を追加します。

<key>CFBundleURLTypes</key>
	<array>
    	<dict>
        	<key>CFBundleTypeRole</key>
        		<string>Editor</string>
        	<key>CFBundleURLSchemes</key>
        		<array>
            	<!-- Copied from GoogleService-Info.plist key REVERSED_CLIENT_ID -->
            	<string>ここにコピペする。</string>
        	</array>
   	 	</dict>
	</array>

GoogleService-Info.plistに書いてある、「REVERSED_CLIENT_ID」の値をコピペしてください。そのまま保存。

[Android]デバッグ用SHA1取得

Android側は既に紹介してあるFirebaseAnalyticsで必要な設定が正しくできておりかつ、デバッグ環境と本番アプリのそれぞれでSHA1の値をFirebase側に設定する必要があります。今回は開発用SHA1を取得する手順のみ紹介します。本番用SHA1はGoogleConsoleから取得する?みたいです。

早速ですが、コマンドを入力してみましょう。

keytool -v -list -keystore ~/.android/debug.keystore

パスワードは何も入力せずEnterで大丈夫です。
自分の環境ではJavaRuntimeがないと言われたので準備します。

詳しい情報をクリックすると公式ページに飛ぶので、JDK Download -> MacOS Installerと進み、インストーラをダウンロード&実行します。dmgをダブルクリックするとインストーラのpkgがあるので、それを実行してください。

SHA1の値がわかったら、Firebase側で設定しましょう。

Google認証画面を呼び出す動作を実装

まずはGoogle認証画面を実際に呼び出す大事な部分を実装します。dartクラスファイルを新規作成し、staticなメソッドを実装します。

import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';

class FirebaseAuthHelper {
  static Future<FirebaseUser> signIn() async {
    final GoogleSignIn _googleSignIn = GoogleSignIn();
    final FirebaseAuth _auth = FirebaseAuth.instance;
    GoogleSignInAccount googleCurrentUser = _googleSignIn.currentUser;
    try {
      if (googleCurrentUser == null)
        googleCurrentUser = await _googleSignIn.signInSilently();
      if (googleCurrentUser == null)
        googleCurrentUser = await _googleSignIn.signIn();
      if (googleCurrentUser == null) return null;

      GoogleSignInAuthentication googleAuth =
          await googleCurrentUser.authentication;
      final AuthCredential credential = GoogleAuthProvider.getCredential(
        accessToken: googleAuth.accessToken,
        idToken: googleAuth.idToken,
      );
      final FirebaseUser user =
          (await _auth.signInWithCredential(credential)).user;
      print("signed in " + user.displayName);

      return user;
    } catch (e) {
      print(e);
      return null;
    }
  }
}

名前とかは自分の分かりやすい様に変更してください。そしてこのstaticなメソッドを呼び出す側を記述します。ボタンWidgetと結果表示用ダイアログを表示するメソッドのみ抜き出しますので、各自でいい感じに実装してください。

RaisedButton(
            child: Text('Sign in Google'),
            onPressed: () {
              FirebaseAuthHelper.signIn()
                  .then((FirebaseUser user) => _showResultDialog(user))
                  .catchError((e) => print(e));
            },
          ),
  void _showResultDialog(FirebaseUser user) {
    if (user == null) {
      showDialog(
        context: context,
        builder: (_) {
          return AlertDialog(
            title: Text("ログイン失敗"),
          );
        },
      );
    } else {
      showDialog(
        context: context,
        builder: (_) {
          return AlertDialog(
            title: Text("ログイン成功"),
            content: Text(user.displayName),
          );
        },
      );
    }
  }

動作確認

では実際にデバッグしてみましょう。以下はiOSでのイメージです。

Contiueを押すと、

そしてログイン情報を正しく入力すると、ログイン成功と出てその下にアカウント名が出ているはずです。また、2回目からは既にログイン状態のため、認証画面は通らずにログイン成功ダイアログが表示されるはずです。

自分も見落としていましたが、Androidのみうまくいかない場合はSHA1の設定が正しいかもう一度確認してみてください。

ログイン状態の保持について

実はFirebaseのパッケージが管理してくれているので、このままアプリを再起動して試してみると分かりますが、ログイン状態は保持されたままです。非常に楽ですね。逆に言えばサインアウト機能を実装しないとログインしたままになってしまいます。

まとめ

既に前に書いた記事等でFirebaseの設定が正しく行われていれば、特に難しい事はなく実装できたはずです。この辺りの情報はネット上でもあまりまとまっていないので(analyticsと同じで需要がない?)今後も継続してまとめていければなと思います。

レンタルサーバはConohaWINGが最強にオススメ!

muchilogでは今までいろんなレンタルサーバやSaaSを使ってきましたが、今では全てをConohaWINGにて運営しています。

■今まで使ってきたサービス一覧
・さくらレンタルサーバ(ベーシックプラン)
・カゴヤ
・Azure
・AWS

今ではこのブログは勿論、webサービスのバックエンドやアプリのサーバ機能もConohaWINGで動かしています。
そんなConohaWINGのメリットをいくつか紹介します!

【国内最速No.1】高性能レンタルサーバーConoHa WING

無料で最大2個の独自ドメインが使える!

サイト運営に必要な独自ドメインをなんと無料で取得することが可能です!これだけでも月100円以上は運営費が節約できます。

優れた速度と安定感

私がAzureやさくらを解約した大きな理由はこれ。Conohaは非常に安定して稼働しており、ダウンタイムがほぼ発生しません。発生した場合は潔くお知らせしてくれます。
また、このブログは勿論、バックエンドとして動いてるプログラムも処理速度が大幅に向上しました(体感で倍速以上)。 Azure等のSaaSからレンタルサーバに移行するって普通考えられませんよね?しかし実際に大きなメリットを感じているのです。

頻繁に開催されるキャンペーン

ConohaWINGは半額に迫るようなキャンペーンを頻繁に開催しています。このキャンペーンによって、性能的には業界トップクラスであるにも関わらず、 月額料金換算で最安値クラスで使えるのです。
基本的に長期一括契約の方がお得になるため、muchilogでは最長で契約することをオススメします。価格と性能のバランスを考えれば他に乗り換えることも考えれられませんし。

レンタルサーバは必須です!

web系のプログラミング学習を進める際には、レンタルサーバの契約は必須と思ってください。ローカルの環境と本番環境で動作が違うことは良くありますし、ポートフォリオを公開するのも大切です。

学習や制作に集中するためにも、満足度、速度、安定度全てのレベルが高いConohaWINGを最強にオススメします!

web系サービス開発会社に転職したい!

muchilogではIT系へ転職したいという方には「自社サービスを運営しているweb系企業」への転職をおすすめしています。

web系は「自由な社風」「成長できる環境」「ホワイトな労働条件」であることが多いからです。

そんなweb系企業への転職を確実にするためのプログラミングスクールが登場しました。


RUNTEQ

RUNTEQはただのスクールじゃない!

RUNTEQはweb系の開発会社。開発会社が運営するスクールなので必要とされる技術力は勿論習得可能。しかしそれだけではないのです。

特にweb系で転職・就職活動を行う際にはポートフォリオを求められることがあります。ポートフォリオとは自分自身の作品のことで、技術力や企画力を示すものです。

RUNTEQではポートフォリオの作成を企画段階からサポートしてくれます!

他のプログラミングスクールでは提携企業の派遣やアルバイトとして就職するしかなかったりもしますが、RUNTEQはあなたの市場価値を高める方法まで教えてくれるということですね。

また、RUNTEQが扱う教材はどれも第一線で当たり前に使われている技術。特に未経験者の独学ではどうしてもスキルセットに穴が出来てしまいます。その点RUNTEQは確実に現場力を養えます。

そして2020年2月〜2021年12月までの内定者の98%がweb系企業に内定しています。これはRUNTEQの指導力とサポートが優れていることの証拠でしょう。

まずは無料説明会に申し込んではいかがでしょうか?

RUNTEQ


Flutter
muchiをフォローする
MUCHILOG
タイトルとURLをコピーしました