swift Firebase Googleログイン実装忘備録
この記事が大変良くまとまっています。
なので、ここでは実装のコードと説明だけを記載します。
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