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

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

Parseサービス終了に伴う、受け皿のFirebaseです。AWSサービスにもかぶります。[Google I/O](https://youtu.be/mp6UsuRteNw?t=7926)にて、リノベートされたとのことでしたので、メール&パスワードログインと、Googleログインを使ってみました。

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

Podでプロジェクトを作成するまではkoogawaさんの[ページ](http://qiita.com/koogawa/items/ca8cce019b4ff7ce2576)をご覧ください。

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

```  pod 'Firebase/Auth' ```


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

![Screen Shot 2016-05-22 at 8.12.04 AM.png](https://qiita-image-store.s3.amazonaws.com/0/75231/e56311bd-41fb-d380-7bad-0cdf314c4a82.png)

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

実装します。

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

```swift: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](https://qiita-image-store.s3.amazonaws.com/0/75231/085bbe09-ac3a-8a0f-c6f4-43d10ca66e5e.jpeg)

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

```swift: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'`

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

```swift:MyFire1-Bridging-Header.h
#import <GoogleSignIn/GoogleSignIn.h>
```
![Screen Shot 2016-05-22 at 12.31.49 PM.png](https://qiita-image-store.s3.amazonaws.com/0/75231/383c96a0-8a9d-667f-0c73-98de6dd10029.png)

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

![MyFire1_xcodeproj.jpg](https://qiita-image-store.s3.amazonaws.com/0/75231/f39e88de-5ac5-0a02-8ee2-4f40d831c9e3.jpeg)

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

```swift: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に飛ばすボタンを設置します。

```swift: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](https://qiita-image-store.s3.amazonaws.com/0/75231/5983c711-1316-5e47-48a4-98c0f4104250.png)

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

![iPhone_6s_-_iPhone_6s___iOS_9_3__13E230_.jpg](https://qiita-image-store.s3.amazonaws.com/0/75231/29e6d8b2-8466-280f-885b-034d2466c022.jpeg)


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

![Firebase.jpg](https://qiita-image-store.s3.amazonaws.com/0/75231/d6565df1-7aaa-d3c2-a180-00b6b19e5938.jpeg)


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