Help us understand the problem. What is going on with this article?

Firebase の Auth 機能を使ってみる。Swift版

More than 3 years have passed since last update.

Firebaseとは

私はiOSデベロッパーですので、WWDCはジョブス時代から見てますが、Google I/Oは一度も見たことがありませんでした。野外コンサート会場みたいなんですね。。。グーグルのCEOスンダーはインド人です。マイクロソフトのCEOもインド人ですね。ティムクックもインドを訪問し、インドで4000人のエンジニアを採用すると発表しましたが、インドの勢いはすごいですね。

Parseサービス終了に伴う、受け皿のFirebaseです。AWSサービスにもかぶります。Google I/Oにて、リノベートされたとのことでしたので、メール&パスワードログインと、Googleログインを使ってみました。

メール&パスワードログイン

Podでプロジェクトを作成するまではkoogawaさんのページをご覧ください。

Podfileに下記を追加し、pod update してください。

pod 'Firebase/Auth'

Firebaseのコンソールから、Auth>ログイン方法を選択し、Email/passwordGoogleを有効にします。

Screen Shot 2016-05-22 at 8.12.04 AM.png

Storyboardで、メール、パスワード用のUITextFieldを適当に作成します。(email,passwdとします)

実装します。

ここで、メールアドレスはなんでもいいようですが、gmailやyahooドメインの場合は存在チェックをしているようです。

ViewController.swift
        FIRAuth.auth()?.createUserWithEmail(email.text!, password: passwd.text!, completion: { (user:FIRUser?, error:NSError?) in
            if let error = error {
                print("Creating the user failed! \(error)")
                return
            }

            if let user = user {
                print("user : \(user.email) has been created successfully.")
            }
        })

実行します。

Firebaseのコンソールから、アカウントが作成されたか確認します。
Auth > ユーザ を開きます。

Firebase.jpg

ログインの処理も同じように、signInWithEmail() を使用します。
先ほど作成したアカウントでログインしてみてください。

ViewController.swift
        FIRAuth.auth()?.signInWithEmail(email.text!, password: passwd.text!, completion: { (user:FIRUser?, error:NSError?) in
            if let error = error {
                print("login failed! \(error)")
                return
            }

            if let user = user {
                print("user : \(user.email) has been signed in successfully.")
            }
        })

Googleログイン

次は、Googleに飛ばしてログインさせる方法です。

Podfileに以下を追加します。

pod 'GoogleSignIn'

ブリッジヘッダーファイルを作成し、プロジェクトに追加します。

MyFire1-Bridging-Header.h
#import <GoogleSignIn/GoogleSignIn.h>

Screen Shot 2016-05-22 at 12.31.49 PM.png

Info > URL Typeに、以下の2つのエントリを追加します。
- GoogleService-Info.plist のREVERSED_CLIENT_IDの値
- Bundle ID

MyFire1_xcodeproj.jpg

AppDelegateを以下のように修正します。

AppDelegate.swift
import UIKit
import Firebase
import FirebaseAuth

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, GIDSignInDelegate {

    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        FIRApp.configure()
        GIDSignIn.sharedInstance().clientID = FIRApp.defaultApp()!.options.clientID
        GIDSignIn.sharedInstance().delegate = self

        return true
    }

    func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
        return GIDSignIn.sharedInstance().handle(url,
                                                    sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String,
                                                    annotation: options[UIApplicationOpenURLOptionsKey.annotation])
    }

    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
        if let error = error {
            print("Error: \(error.localizedDescription)")
            return
        }
        let authentication = user.authentication
        // Googleのトークンを渡し、Firebaseクレデンシャルを取得する。
        let credential = FIRGoogleAuthProvider.credential(withIDToken: (authentication?.idToken)!,
                                                          accessToken: (authentication?.accessToken)!)
        // Firebaseにログインする。
        FIRAuth.auth()?.signIn(with: credential) { (user, error) in
            print("Sign on Firebase successfully")
            // performSegue でログイン後のVCへ遷移させる。
        }
    }

    func sign(_ signIn: GIDSignIn!, didDisconnectWith user: GIDGoogleUser!, withError error: Error!) {
        print("Sign off successfully")
    }    

ViewControllerに、Googleに飛ばすボタンを設置します。

ViewController.swift
import UIKit
import FirebaseAuth
import Firebase

class ViewController: UIViewController, GIDSignInUIDelegate {
...
    override func viewDidLoad() {
        super.viewDidLoad()

        GIDSignIn.sharedInstance().uiDelegate = self

        // ログインボタンを追加
        let signInButton = GIDSignInButton()
        self.view.addSubview(signInButton)
    }

シミュレータで実行します。

Googleへのサインインボタンが表示されます。タップします。

Screen Shot 2016-05-22 at 1.34.46 PM.png

Googleのログインページに飛びます。ご自身のGmailアカウントでログインします。成功すると元のページにリダイレクトします。

iPhone_6s_-_iPhone_6s___iOS_9_3__13E230_.jpg

Firebaseコンソールのユーザから、ログインしたユーザが確認できます。
プロバイダのアイコンがグーグルのアイコンになっているのが、Googleで認証したユーザです。

Firebase.jpg

参考

https://www.youtube.com/watch?v=8sRUhzgJhcY

tfutada
フタソフト合同会社CEO シリコンバレー、ニューヨーク(NTTデータUSA)、インド(マヒンドラサティヤム)、ベトナム(フリー)を経て、現在は東南アジアのオフショア開発のコンサルティング会社経営 Swift Kotlin Python Go TS 英語(TOEIC895)、中国語(ニイハオレベル)。語学は発音がすべて。
https://note.mu/tafutafu
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした