【ios/firebase】初めてのtwitter認証

# やりたきこと
firebaseを使ったiosアプリでtwitter認証してみる

# 誰向け？
つい数時間前の自分
　・WEBバックエンド開発を主な生業
　・iosアプリ開発は未経験
　・twitter利用経験なし(アカウントはさっき作った)
　・公式ドキュメントの手順見ても、どこに追記するのかすら分からん

そんな数時間前の自分に向けてやさしく解説してみる。

# 環境
Xcode Version 10.1
CocoaPods Version 1.9.3
Swift Version 4.2.1

# 早速開発
### 
[公式](https://firebase.google.com/docs/auth/ios/twitter-login?hl=ja) 「はじめに」 -> 1 の設定
Firebase/Authをinstall

```
target 'app' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for app
  pod 'Firebase/Auth'  <---追加
end
```

```
pod update
```


### FirebaseのAuthenticationのtwitter認証の設定を行う
[公式](https://firebase.google.com/docs/auth/ios/twitter-login?hl=ja) 「はじめに」 -> 2,3,4 の設定
![スクリーンショット 2020-10-09 7.09.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409126/35b8fc3c-f8c0-9a4f-56d3-5835d19027b0.png)

### URL Typesの設定
[公式](https://firebase.google.com/docs/auth/ios/twitter-login?hl=ja) 「Firebase iOS SDK でログインフローを処理するには:」 -> 1の設定

``REVERSED_CLIENT_ID``の情報を控える
![スクリーンショット 2020-10-09 7.19.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409126/abefc58d-0cfe-721d-113d-c3cbaf23a27d.png)

URL TypesのURL Schemesに追加
![スクリーンショット 2020-10-09 8.50.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409126/8a386739-cbb3-d0d6-7dc7-c35efe491847.png)


### 実装

「twitterでSign in」ボタンだけ配置して認証/認可を確認
![スクリーンショット 2020-10-09 9.05.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409126/888fb584-00af-9609-a362-14e57ec24951.png)


実装内容は公式丸パクリ!

```swift:ViewController.swift
import UIKit
import Firebase

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func twitterSignInButton(_ sender: Any) {
        var provider = OAuthProvider(providerID: "twitter.com")
        provider.getCredentialWith(nil) { credential, error in
            if error != nil {
                // Handle error.
            }
            if credential != nil {
                Auth().signIn(with: credential) { authResult, error in
                    if error != nil {
                        // Handle error.
                    }
                     // User is signed in.
                }
            }
        }
    }
}
```

・・・すると、ビルドエラーになります

![スクリーンショット 2020-10-09 5.37.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409126/4544723e-4958-3781-026e-562059f61568.png)


[この記事](https://qiita.com/gremito/items/d14c21e2591e3223c5b9)を参考に解決

```swift:diff
 import UIKit
 import Firebase
+import FirebaseAuth
 
 class ViewController: UIViewController {
     
+    var twitterProvider : OAuthProvider?
+    
     override func viewDidLoad() {
         super.viewDidLoad()
+        self.twitterProvider = OAuthProvider(providerID:"twitter.com");
     }
     
    @IBAction func twitterSignInButton(_ sender: Any) {
-        var provider = OAuthProvider(providerID: "twitter.com")
-        provider.getCredentialWith(nil) { credential, error in
    @IBAction func twitterSignInButton(_ sender: Any) {
+        self.twitterProvider?.getCredentialWith(_: nil){ (credential, error) in
             if error != nil {
                 // Handle error.
             }
-            if credential != nil {
-                Auth().signIn(with: credential) { authResult, error in
+            if let credential = credential {
+                Auth.auth().signIn(with: credential) { (authResult, error) in
                     if error != nil {
                         // Handle error.
                     }

```

とりあえず、動かす
![スクリーンショット 2020-10-09 6.00.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409126/c9356e1e-4468-160c-db62-c81cd13ce53d.png)

動いた！

# 動作確認
「twitter でSign in」ボタンを押すと
![スクリーンショット 2020-10-09 6.52.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409126/d7c85bc7-056f-bb48-5c76-28b7f9a9d09c.png)

Sigin Inしても何も実装していないので、最初の画面が出てきちゃいます。
認証されたかはFirebaseの画面で確認
![スクリーンショット 2020-10-09 6.53.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409126/8c5202c6-c670-48ac-c782-20839382ae3e.png)

大丈夫そう！

# 最後に
以前、WEBサービスのtwitter認証周りをやったことがあり、
結構大変だった記憶があるのですが、Firebase使うと簡単にできました。
小規模アプリなら活用する機会多いかもしれないです。
これからアプリのほう拡張していきたいと思います。