iOS で Google ログインを使用して認証する

Google ログインをアプリに統合して、ユーザーが Firebase での認証に Google アカウントを使用できるようにすることができます。

準備

  1. Firebase を iOS プロジェクトに追加しますPodfile に次のポッドをインクルードします。
     verbatim 69c2a21022e657d9f2ea355fa969894c pod 'Firebase/Auth' endverbatim 69c2a21022e657d9f2ea355fa969894c 
     verbatim 6f8d6c8f285f011458bd000ae0c62657 pod 'GoogleSignIn' endverbatim 6f8d6c8f285f011458bd000ae0c62657 
    
  2. アプリを Firebase プロジェクトに接続していない場合は、Firebase console で接続します。
  3. Firebase console で Google ログインを有効にします。
    1. Firebase console で [認証] セクションを開きます。
    2. [ログイン方法] タブで [Google] を有効にし、[保存] をクリックします。

1. 必須ヘッダー ファイルをインポートする

まず Firebase SDK と Google ログイン SDK のヘッダー ファイルをアプリにインポートします。

Objective-C

アプリのデリゲートで、次のヘッダー ファイルをインポートします。

 verbatim 5c33f4570b72130873c60c78722008e5 @import Firebase; endverbatim 5c33f4570b72130873c60c78722008e5 
 verbatim 2faa6f0e20bc16a1515c44e7e695c68a @import GoogleSignIn; endverbatim 2faa6f0e20bc16a1515c44e7e695c68a 

ログインビューのビュー コントローラで、次のヘッダー ファイルをインポートします。

 verbatim 5c33f4570b72130873c60c78722008e5 @import Firebase; endverbatim 5c33f4570b72130873c60c78722008e5 
 verbatim 2faa6f0e20bc16a1515c44e7e695c68a @import GoogleSignIn; endverbatim 2faa6f0e20bc16a1515c44e7e695c68a 

Swift

アプリのデリゲートで、次のヘッダー ファイルをインポートします。

 verbatim c3fad3a89716a15053d1a55a33039b98 import Firebase endverbatim c3fad3a89716a15053d1a55a33039b98 
 verbatim 80fc15802fd3010f8adf6552ac3f419e import GoogleSignIn endverbatim 80fc15802fd3010f8adf6552ac3f419e 

ログインビューのビュー コントローラで、次のヘッダー ファイルをインポートします。

 verbatim c3fad3a89716a15053d1a55a33039b98 import Firebase endverbatim c3fad3a89716a15053d1a55a33039b98 
 verbatim 80fc15802fd3010f8adf6552ac3f419e import GoogleSignIn endverbatim 80fc15802fd3010f8adf6552ac3f419e 

2. Google ログインを実装する

Google ログインを実装する手順は次のとおりです。iOS で Google ログインを使用する方法について詳しくは、Google ログインに関するデベロッパー向けドキュメントをご覧ください。

  1. Xcode プロジェクトにカスタム URL スキームを追加します。
    1. プロジェクトの設定を開きます(左側のツリービューでプロジェクト名をダブルクリックします)。[ターゲット] セクションでアプリを選択し、[情報] タブを開いて [URL タイプ] セクションを展開します。
    2. [+] ボタンをクリックし、反転クライアント ID の URL スキームを追加します。この値を確認するには、GoogleService-Info.plist 設定ファイルを開いて REVERSED_CLIENT_ID キーを探します。見つかったキーの値をコピーし、設定ページの [URL スキーム] ボックスに貼り付けます。その他の入力欄は空白にしておきます。

      完了すると、設定は次のようになります(ただし、値はアプリケーションによって異なります)。

  2. アプリのデリゲートによって GIDSignInDelegate プロトコルを実装することを宣言します。

    Objective-C

    MainViewController.h:
     verbatim cbc291ab698fb31d54172ff1feb6f97a @interface MainViewController : UITableViewController<GIDSignInDelegate,
                                                          GIDSignInUIDelegate> endverbatim cbc291ab698fb31d54172ff1feb6f97a 
    

    Swift

    MainViewController.swift:
     verbatim fd43ec94cc8672d2ca3370c159e529d6 class MainViewController: UITableViewController, GIDSignInDelegate, GIDSignInUIDelegate { endverbatim fd43ec94cc8672d2ca3370c159e529d6 
    
  3. アプリのデリゲートの application:didFinishLaunchingWithOptions: メソッドで、FIRApp オブジェクトを設定し、ログインのデリゲートを設定します。

    Objective-C

     verbatim f4837415eb98478ae53b9bc9796b0226 // Use Firebase library to configure APIs
    [FIRApp configure]; endverbatim f4837415eb98478ae53b9bc9796b0226 
    
     verbatim 81164f62e4aa368af2d20dd1e762ef13 [GIDSignIn sharedInstance].clientID = [FIRApp defaultApp].options.clientID;
    [GIDSignIn sharedInstance].delegate = self; endverbatim 81164f62e4aa368af2d20dd1e762ef13 
    

    Swift

     verbatim 2ac23ab3ab1009da8a019fb5469208e7 // Use Firebase library to configure APIs
    FIRApp.configure() endverbatim 2ac23ab3ab1009da8a019fb5469208e7 
    
     verbatim d07a0d2a8cad214b977966f0c80108c8 GIDSignIn.sharedInstance().clientID = FIRApp.defaultApp()?.options.clientID
    GIDSignIn.sharedInstance().delegate = self endverbatim d07a0d2a8cad214b977966f0c80108c8 
    
  4. アプリのデリゲートに application:openURL:options: メソッドを実装します。このメソッドは GIDSignIn インスタンスの handleURL メソッドを呼び出します。これによって、認証プロセスの最後にアプリが受け取る URL が正しく処理されます。

    Objective-C

     verbatim 379b7c036fe906af9f2357776534f08c - (BOOL)application:(nonnull UIApplication *)application
                openURL:(nonnull NSURL *)url
                options:(nonnull NSDictionary<NSString *, id> *)options { endverbatim 379b7c036fe906af9f2357776534f08c 
      return [[GIDSignIn sharedInstance] handleURL:url
     verbatim 2d70afe6478c565ceba879c34af7b76f          sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                    annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
    } endverbatim 2d70afe6478c565ceba879c34af7b76f 
    }
    

    Swift

     verbatim d0fe4344d8fddebd5f1201b00ecdb724 @available(iOS 9.0, *)
    func application(_ application: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any])
      -> Bool { endverbatim d0fe4344d8fddebd5f1201b00ecdb724 
        return GIDSignIn.sharedInstance().handleURL(url,
     verbatim 140adf7e5bc909180272648a4a1e1ad3                             sourceApplication:options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String,
                                annotation: [:])
    } endverbatim 140adf7e5bc909180272648a4a1e1ad3 
    }
    

    iOS 8 以前で実行されるアプリの場合は、サポートが終了した application:openURL:sourceApplication:annotation: メソッドも実装します。

    Objective-C

     verbatim 02659e967da878708ee6295a4dda73e7 - (BOOL)application:(UIApplication *)application
                openURL:(NSURL *)url
      sourceApplication:(NSString *)sourceApplication
             annotation:(id)annotation { endverbatim 02659e967da878708ee6295a4dda73e7 
      return [[GIDSignIn sharedInstance] handleURL:url
                                 sourceApplication:sourceApplication
                                        annotation:annotation];
        

    Swift

     verbatim e88978734b074fcdfba0c75f0d655d77 func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { endverbatim e88978734b074fcdfba0c75f0d655d77 
        return GIDSignIn.sharedInstance().handleURL(url,
                                                    sourceApplication: sourceApplication,
                                                    annotation: annotation)
        
  5. アプリのデリゲートで、ログイン プロセスを処理する GIDSignInDelegate プロトコルを実装するために次のメソッドを定義します。

    Objective-C

     verbatim 56347a8eaf494ff7bf85ddc03ade5150 - (void)signIn:(GIDSignIn *)signIn
    didSignInForUser:(GIDGoogleUser *)user
         withError:(NSError *)error {
      if (error == nil) {
        GIDAuthentication *authentication = user.authentication;
        FIRAuthCredential *credential =
        [FIRGoogleAuthProvider credentialWithIDToken:authentication.idToken
                                         accessToken:authentication.accessToken];
        // ...
      } else
        // ...
    } endverbatim 56347a8eaf494ff7bf85ddc03ade5150 
    
    - (void)signIn:(GIDSignIn *)signIn
    didDisconnectWithUser:(GIDGoogleUser *)user
         withError:(NSError *)error {
      // Perform any operations when the user disconnects from app here.
      // ...
    }
    

    Swift

     verbatim 22f7ee8454445086591dffcc56127345 func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) {
      if let error = error {
        // ...
        return
      }
    
      guard let authentication = user.authentication else { return }
      let credential = FIRGoogleAuthProvider.credential(withIDToken: authentication.idToken,
          accessToken: authentication.accessToken)
      // ...
    } endverbatim 22f7ee8454445086591dffcc56127345 
    
    func signIn(signIn: GIDSignIn!, didDisconnectWithUser user:GIDGoogleUser!,
      withError error: NSError!) {
        // Perform any operations when the user disconnects from app here.
        // ...
    }
    
  6. ログインビューのコントローラが GIDSignInUIDelegate プロトコルを実装することを宣言します。

    Objective-C

    ビュー コントローラのヘッダー ファイルに次の行を追加します。

     verbatim cbc291ab698fb31d54172ff1feb6f97a @interface MainViewController : UITableViewController<GIDSignInDelegate,
                                                          GIDSignInUIDelegate> endverbatim cbc291ab698fb31d54172ff1feb6f97a 
    

    Swift

    ビュー コントローラに次の行を追加します。

     verbatim fd43ec94cc8672d2ca3370c159e529d6 class MainViewController: UITableViewController, GIDSignInDelegate, GIDSignInUIDelegate { endverbatim fd43ec94cc8672d2ca3370c159e529d6 
    
  7. ビュー コントローラで、viewDidLoad メソッドをオーバーライドして GIDSignIn オブジェクトの UI デリゲートを設定します。さらに、可能な場合はサイレント ログインするようにします(省略可)。

    Objective-C

    - (void)viewDidLoad {
      [super viewDidLoad];
    
     verbatim 3e640ae65341cf7790e80f818e874932 [GIDSignIn sharedInstance].uiDelegate = self;
    [[GIDSignIn sharedInstance] signIn]; endverbatim 3e640ae65341cf7790e80f818e874932 
    
      // TODO(developer) Configure the sign-in button look/feel
      // ...
    }
    

    Swift

    override func viewDidLoad() {
      super.viewDidLoad()
    
     verbatim 4ec2b0e7748e20d35ad506ec2ef2ae42 GIDSignIn.sharedInstance().uiDelegate = self
    GIDSignIn.sharedInstance().signIn() endverbatim 4ec2b0e7748e20d35ad506ec2ef2ae42 
    
      // TODO(developer) Configure the sign-in button look/feel
      // ...
    }
    
  8. GIDSignInButton をストーリーボードまたは XIB ファイルに追加するか、プログラムによって初期化します。このボタンをストーリーボードまたは XIB ファイルに追加するには、ビューを追加して、そのカスタムクラスを GIDSignInButton に設定します。
  9. 省略可: このボタンをカスタマイズする方法は次のとおりです。

    Objective-C

    1. ビュー コントローラのヘッダー ファイルで、ログインボタンをプロパティとして宣言します。
      @property(weak, nonatomic) IBOutlet GIDSignInButton *signInButton;
    2. 宣言した signInButton プロパティにボタンを接続します。
    3. GIDSignInButton オブジェクトのプロパティを設定してボタンをカスタマイズします。

    Swift

    1. ビュー コントローラで、ログインボタンをプロパティとして宣言します。
      @IBOutlet weak var signInButton: GIDSignInButton!
    2. 宣言した signInButton プロパティにボタンを接続します。
    3. GIDSignInButton オブジェクトのプロパティを設定してボタンをカスタマイズします。

3. Firebase で認証する

signIn:didSignInForUser:withError: メソッドで、Google ID トークンと Google アクセス トークンを GIDAuthentication オブジェクトから取得して、Firebase 認証情報と交換します。

Objective-C

 verbatim 56347a8eaf494ff7bf85ddc03ade5150 - (void)signIn:(GIDSignIn *)signIn
didSignInForUser:(GIDGoogleUser *)user
     withError:(NSError *)error {
  if (error == nil) {
    GIDAuthentication *authentication = user.authentication;
    FIRAuthCredential *credential =
    [FIRGoogleAuthProvider credentialWithIDToken:authentication.idToken
                                     accessToken:authentication.accessToken];
    // ...
  } else
    // ...
} endverbatim 56347a8eaf494ff7bf85ddc03ade5150 

Swift

 verbatim 22f7ee8454445086591dffcc56127345 func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) {
  if let error = error {
    // ...
    return
  }

  guard let authentication = user.authentication else { return }
  let credential = FIRGoogleAuthProvider.credential(withIDToken: authentication.idToken,
      accessToken: authentication.accessToken)
  // ...
} endverbatim 22f7ee8454445086591dffcc56127345 

最後に、認証情報を使用して Firebase での認証を行います。

Objective-C

 verbatim 250f0c4b6af36828ab7637eeb89b0f4d [[FIRAuth auth] signInWithCredential:credential
                          completion:^(FIRUser *user, NSError *error) {
                            // ...
                              if (error) {
                                // ...
                                return;
                              } endverbatim 250f0c4b6af36828ab7637eeb89b0f4d 

Swift

 verbatim c03f657c17c9bc1a332468b1dba71322 FIRAuth.auth()?.signIn(with: credential) { (user, error) in
  // ...
    if let error = error {
      // ...
      return
    } endverbatim c03f657c17c9bc1a332468b1dba71322 

次のステップ

ユーザーが初めてログインすると新しいユーザー アカウントが作成され、ユーザーがログインに使用した認証情報(ユーザー名とパスワードや認証プロバイダ情報)にリンクされます。この新しいアカウントは Firebase プロジェクトの一部として保存され、ユーザーのログイン方法にかかわらず、プロジェクトのすべてのアプリでユーザーを識別するために使用できます。

  • アプリでは、FIRUser オブジェクトからユーザーの基本的なプロフィール情報を取得できます。ユーザーの管理についての記事をご覧ください。

  • Firebase Realtime Database と Firebase Storage のセキュリティ ルールで、ログイン済みユーザーに固有のユーザー ID を auth 変数から取得し、これを使用してユーザーがアクセスできるデータを制御できます。

既存のユーザー アカウントに認証プロバイダの認証情報をリンクすることで、ユーザーが複数の認証プロバイダを使用してアプリにログインできるようになります。

ユーザーのログアウトを行うには signOut: を呼び出します。

Objective-C

     verbatim 04b7942200f87110f17e350e0b03a2c4 NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
} endverbatim 04b7942200f87110f17e350e0b03a2c4 

Swift

     verbatim c948d7de7d4cc8ce8216f43e11ecef46 let firebaseAuth = FIRAuth.auth()
do {
  try firebaseAuth?.signOut()
} catch let signOutError as NSError {
  print ("Error signing out: %@", signOutError)
} endverbatim c948d7de7d4cc8ce8216f43e11ecef46 
  

さまざまな認証エラーに対応できるようにエラー処理コードを追加することもできます。エラーの処理についての記事をご覧ください。

フィードバックを送信...