[Swift版] 今さら聞けないFirebase③ Authentication (認証) Twitter 編

# はじめに
今さら聞けないFirebaseシリーズ第三弾は、
Authentication(認証)のTwitterによるユーザ認証の実装方法についてご紹介します。

前回ご紹介した[メール、パスワードによる認証](http://qiita.com/eKushida/items/5fe8fff256f8870f5be7)より前準備に時間がかかりますが、
ユーザのことを考えるとOpenIDによる認証は必須ですね。

## やること
・Authentication(Twitter)の導入方法について
・ログインのサンプルコードのご紹介

## やらないこと
・[Firebaseの導入について](http://qiita.com/eKushida/items/54b62d3961a5c74a71af)
・[Authenticationの導入について](())
・[エラーハンドリングについて](https://firebase.google.com/docs/auth/ios/errors)
・[TwitterKitについて](https://docs.fabric.io/apple/twitter/overview.html)
・ログアウトのサンプルコードのご紹介

# 導入方法
1. Firebaseにプロジェクトを追加する
2. Twitterによるログインを許可する
3. TwitterKitを追加する
4. ログイン機能を実装する

# 1. Firebaseにプロジェクトを追加する
[導入方法はこちらへ](http://qiita.com/eKushida/items/54b62d3961a5c74a71af)

# 2. Twitterによるログインを許可する

## 2.1. 対象アプリでTwitterによるログインができるようにする
[Firebase Console](https://firebase.google.com/console/)のAuthタブ > ログイン方法にて、Twitterによるログインを有効する

<img width="932" alt="スクリーンショット 2016-07-30 11.42.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/4a209487-8371-e065-986c-dd177fe0c402.png">

### ■補足事項
・APIキーとAPIシークレットは、2.4でTwitter Application Managementから取得する
・コールバックURLは、2.3.でTwitter Application Managementで利用するため、コピーしておく

## 2.2. 対象アプリを登録する
[Twitter Application Management](https://apps.twitter.com/)にて、Create New Appを押下し、対象のアプリを登録する

<img width="986" alt="スクリーンショット 2016-07-30 11.40.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/74b84530-861c-1520-d486-c5ba577d37a9.png">

## 2.3. 対象アプリの必要情報を入力する
コールバックURLには、2.1で取得したURLを入力する
入力後同意して、Create your Twitter Applicationボタンを押下する

<img width="1075" alt="スクリーンショット 2016-07-30 11.45.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/c0fbc179-8413-b89a-5d6a-9c4c181ae657.png">

Twitterの設定が完了すると、下記のような画面が表示されます

<img width="1000" alt="スクリーンショット 2016-07-30 11.47.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/67a94607-0fa2-892f-e27f-9696031bef42.png">

## 2.4.  APIキーとAPIシークレットを確認する
[Twitter Application Management](https://apps.twitter.com/)のKeys and Acccess Tokensタブにて、APIキーとAPIシークレットをコピーしておく

<img width="831" alt="スクリーンショット 2016-07-30 11.49.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/e4e15520-1fcd-df05-2375-b8685bcdba47.png">

## 2.5. APIキーとAPIシークレットを設定する
[Firebase Console](https://firebase.google.com/console/)のAuthに戻り、APIキーとAPIシークレットを保存する

<img width="932" alt="スクリーンショット 2016-07-30 12.03.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/ba8029be-53dc-61c7-eeaa-5eb5f1e3f811.png">

ここまでで前準備が終わりです。

# 3. TwitterKitを追加する
[Install Twitter via CocoaPods](https://fabric.io/kits/ios/twitterkit/install)の手順に沿って進めると分かりやすいです。
Fabricにログインしておきましょう！

## 3.1. Podfileに下記を追加する

```:Podfile
use_frameworks!

target 'FirebaseTwitterLoginDemo' do
 pod 'Firebase'
 pod 'Firebase/Auth'
 pod 'Fabric'
 pod 'TwitterKit'

end

target 'FirebaseTwitterLoginDemoTests' do

end
```

## 3.2. 対象プロジェクトのRun Scriptにスクリプトを追加する
追加するスクリプトは、[Install Twitter via CocoaPods](https://fabric.io/kits/ios/twitterkit/install)にて発行されたスクリプトを利用する
*【注意】* ログインしていなければ取得できません

<img width="1014" alt="スクリーンショット 2016-07-30 12.13.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/8dae0b42-6275-c0cb-ce79-7e1505f3ed2c.png">

## 3.3. 対象プロジェクトのinfo.plistにAPIキーを追加する
追加するAPIキーは、[Install Twitter via CocoaPods](https://fabric.io/kits/ios/twitterkit/install)にて発行されたAPIキーを利用する

<img width="1010" alt="スクリーンショット 2016-07-30 12.16.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/909b0da0-5b7b-6232-3861-f01432ddb892.png">

## 3.4. 初期化コードを追加する

```:AppDelegate.swift
import UIKit
import Firebase
import Fabric
import TwitterKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        FIRApp.configure()
        Fabric.with([Twitter.self])
        return true
    }
}
```

# 4.ログイン機能を実装する
## 4.1. ログインのサンプルコード
無事にログインできると、Twitterのユーザ名(displayName)が表示される

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

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        setup()
    }
    
    func setup() {
        let logInButton = TWTRLogInButton(logInCompletion: { session, error in
            
            if let session = session {
                
                let credential = FIRTwitterAuthProvider.credentialWithToken(session.authToken,
                    secret: session.authTokenSecret)
                
                FIRAuth.auth()?.signInWithCredential(credential) { (user, error) in
                    
                    if let error = error {
                        //TOOD: エラーハンドリング
                        print(error)
                        return
                    }
                    
                    print("ようこそ! \(user?.displayName)")
                }
                
            } else {
                //TOOD: エラーハンドリング
            }
        })
        
        logInButton.center = view.center
        self.view.addSubview(logInButton)
    }
}
```

# [参考]　初回インストール時の挙動について
初回インストール後の起動時に、Twitterへのアクセス可否を求められる
一度許可すると、二回目以降は表示されない

（1）Twitterのログインボタンの表示
　アプリを起動後に、ログインボタンが表示される

<img width="280" alt="スクリーンショット 2016-07-31 20.54.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/d6657031-d0d6-43ab-b6d7-b26b95dad075.png">

（2）Twitterへのアクセス可否ダイアログの表示
　ログインボタンを押下すると、初回時のみTwitterへのアクセス可否ダイアログが表示される

<img width="281" alt="スクリーンショット 2016-07-31 20.58.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/fbd349c7-70b5-0630-e2e2-b39408fc144f.png">

（3）Twitterアカウントでログインを促す画面の表示
　Twitterへのアクセス可否ダイアログのOKボタンを押下すると、Twitterアカウントでのログインを求められる

<img width="280" alt="スクリーンショット 2016-07-31 20.58.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/ed1f589d-35c0-403b-743a-4c71d28e6719.png">

（４）Sign Inを押下すると、無事ログインができる

# まとめ
今回は、Twitterによる認証のサンプルをご紹介しました。

事前準備として、Firebase ConsoleとTwitter Application Managementにて、
各種設定をする必要がありますが、順を追って設定すれば、難しいところはありません。

TwitterKitでは、ログインメソッド単体でも提供されています。
独自の画面にTwitterのログイン機能を実装することも可能です。
詳細は、TwitterKitのドキュメントをみてください。