swift Firebase Googleログイン実装忘備録

この記事が大変良くまとまっています。

dev.classmethod.jp

なので、ここでは実装のコードと説明だけを記載します。

AppDelegate アプリ全体の設定などを記載するクラスです。初めに呼ばれます。

import UIKit
import Firebase
import GoogleSignIn

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        // Initialize Google sign-in これを追記
        GIDSignIn.sharedInstance().clientID = "xxxxxxx.apps.googleusercontent.com"

        FirebaseApp.configure()
        return true
    }

LoginViewController ログインを実装するコントローラー

import UIKit
import Firebase
//これを追加
import GoogleSignIn


    override func viewDidLoad() {
        super.viewDidLoad()
     
//viewDidLoadに記載しておく
   GIDSignIn.sharedInstance().presentingViewController = self
        GIDSignIn.sharedInstance().delegate = self
      
    }

//google loginボタンをタップされたときの処理
    @IBAction func googleSignInTapped(_ sender: Any) {

//これがシングルトンといって、どのクラスからでも共通に呼び出せる=>後述
//これを記載することにより、GoogleLoginのデリゲートメソッドが呼ばれる
        GIDSignIn.sharedInstance()?.signIn()
    }

呼び出されるGoogleLoginのデリゲートメソッド

//google login
    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
        if let error = error {
          if (error as NSError).code == GIDSignInErrorCode.hasNoAuthInKeychain.rawValue {
            print("The user has not signed in before or they have since signed out.")
          } else {
            print("\(error.localizedDescription)")
          }
          return
        }

        guard let idToken = user.authentication.idToken, let accessToken = user.authentication.accessToken else { return }
        // Perform any operations on signed in user here.
        let userId = user.userID                  // For client-side use only!
        let fullName = user.profile.name

        let email = user.profile.email
       
//credentialとは=>後述
        let credential = GoogleAuthProvider.credential(withIDToken: idToken,
                                                            accessToken: accessToken)
       
//Firebaseに credentialを利用して ログインしている
 Auth.auth().signIn(with: credential) { (result, error) in
            if let err = error {
                debugPrint(err)
            }else{
                let storyboard = UIStoryboard(name: DiaryIndexController.className, bundle: nil)
                let nextVC = storyboard.instantiateViewController(withIdentifier: DiaryIndexController.className)
                nextVC.modalPresentationStyle = .fullScreen
                self.present(nextVC, animated: true, completion: nil)
            }
        }
    }

    //can not sign in with google
    func sign(_ signIn: GIDSignIn!, didDisconnectWith user: GIDGoogleUser!,
              withError error: Error!) {
        //todo alert
    }

credentialとは? アクセストークン」と「IDトークン」から成っています

アクセストークンとは?

アクセス権限のことです。userの情報にアクセスできるとしても、どこまでの範囲なのかわかりません。 それで、user nameだけなのか? カレンダーや写真にもアクセスできるのか? それらを決めているものです。Googleが発行します。

IDトークンとは?

本人かどうかを確認するものです。これもサーバー側でGoogleが発行します。 これによって本人が利用していることが担保されます。 このときにセッションが作られます。

この2つをセットにしてcredentialのインスタンスをつくり、それでもってFirebaseにloginしています。

上記のこのあたりの記載です。

//credentialとは=>後述
        let credential = GoogleAuthProvider.credential(withIDToken: idToken,
                                                            accessToken: accessToken)
       
//Firebaseに credentialを利用して ログインしている
 Auth.auth().signIn(with: credential) { (result, error) in

シングルトンについては、公式サイトを紹介しておきます。

developer.apple.com