Firebase/Authenticationを使用してTwitterLoginを実装

#はじめに
Firebaseの機能の一つ**"Authentication"**を使用してTwitterLoginを実装する方法についての記事です。
[Firebaseガイド](https://firebase.google.com/docs/auth/ios/twitter-login?hl=ja)を参考にしていたのですが、理解度が足りてないからか手間取ったのでまとめてみました。


# 準備

## TwitterのAPIKeyとAPISecretを取得
[TwitterApp](https://apps.twitter.com/)に登録後にTwitterApplicationを作成しAPIKeyとAPISecretを取得。

TwitterAppの登録が割と面倒に感じたのでここは我慢して対応してください笑

## FirebaseConsoleでTwitterLoginを有効化

**FirebaseConsole > Authentication > ログイン方法**
<img width="1436" alt="スクリーンショット_2018-10-09_1_26_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/75593/4904c686-b2d4-1e9f-accd-9c17e7e7c468.png">


(1)TwitterLoginを有効化
(2)APIKeyとAPISecretを登録
(3)CallBackURLをコピーし作成したTwitterApplicationのSettingsの項目"CallbackURLs"に設定
<img width="1440" alt="スクリーンショット_2018-10-09_1_35_10.png" src="https://qiita-image-store.s3.amazonaws.com/0/75593/a8af392e-bc05-c851-a2c7-cdc872dcd00a.png">


# 実装

## twitterkit-{APIKey}をInfo.plistに登録

###Xcodeから直接Info.plistを追加する場合
URL types > Item0 > URL Schemes > Item 0にtwitterkit-{APIKey}を記入
※twitterkit-{APIKey}の{APIKey}には取得したTwitterのAPIKeyを入れてください
<img width="437" alt="スクリーンショット 2018-10-09 1.47.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/75593/13d220a5-a798-2445-c1da-a05209d76fcc.png">


###Vimで追加する場合
Info.plistの<dict></dict>タグの中に記入してください

```Info.plist
<array>
  <dict>
  　  <key>CFBundleURLSchemes</key>
      <array>
        <string>twitterkit-{APIKey}</string>
      </array>
  </dict>
</array>
```

## 使うライブラリをPod経由でインストール
以下二つのライブラリを使用します。
`pod 'Firebase/Auth'`
`pod 'FirebaseUI/Twitter'`

Podfileに追加後に`pod install`を実行してください


## AppDelegateに起動経路ごとに処理を追加

起動時とCustomURLScheme経由でアプリが起動された時の処理を追加します

withConsumerKeyに**APIKey**
consumerSecretに**APISecret**をそれぞれ追加してください

```AppDelegate.swift
import UIKit
import Firebase
import TwitterKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        FirebaseApp.configure()
        TWTRTwitter.sharedInstance().start(withConsumerKey:"{APIKey}",consumerSecret:"{APISecret}")
        return true
    }
    
    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        return TWTRTwitter.sharedInstance().application(app, open: url, options: options)
    }
}
```

## TwitterLogin実装

ざっくりロジック周りの説明
・ログイン成功時のCallBackで返ってくるsession情報からauthToken,authTokenSecretを取得する
・取得したauthToken,authTokenSecretを元にAuth証明書を作成
・作成したAuth証明書を元にFirebase/AuthenticationにSignIn

```ViewController.swift
import UIKit
import FirebaseAuth
import TwitterKit
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let logInButton = TWTRLogInButton(logInCompletion: { session, error in
            if let session = session {
                let authToken = session.authToken
                let authTokenSecret = session.authTokenSecret
                let credential = TwitterAuthProvider.credential(withToken: session.authToken, secret: session.authTokenSecret)
                
                Auth.auth().signIn(with: credential) { (authResult, error) in
                    if let error = error { return }
                    //Sign In Completed
                }
            }
        })
        logInButton.center = self.view.center
        self.view.addSubview(logInButton)
    }
}
```

## 動作確認
**端末上の画面**
<img width="375" alt="IMG_9385.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/75593/487f1382-2c02-541e-1547-17a1b3372ec1.png">

**端末でLogin処理を行った後のAuthenticationのユーザ画面**
ユーザが追加されていることが確認できました！
![スクリーンショット_2018-10-09_2_16_28（2）.png](https://qiita-image-store.s3.amazonaws.com/0/75593/3a4de0fa-3709-02ed-f782-fe7a4141f676.png)

## Tips

**ログインしているユーザ取得**

```
        if let user = Auth.auth().currentUser {
            // User is signed in.
        }else{
            // No user is signed in.
        }
```

**SignOut**

```
        let firebaseAuth = Auth.auth()
        do {
            try firebaseAuth.signOut()
        } catch let signOutError as NSError {
            // SignOut failed
        }
```

## 次回
今回はFirebaseのAuthenticationを使用してTwitterログインを行うという内容でした。
次回は、Twitter画像をStorageに保存しFireStoreにユーザデータを保存するといったFirebase内サービスの連携について書きます！

[次回予告した記事はこちら](https://qiita.com/giiiita/items/5dac045053fced4040e7)