FirebaseでTwitterログインを実現する(Android)


かなりハマったので個人的なメモとして残しておきます。
ここでは全てKotlinで書いていきます。


## FablicでTwiiterが使えなくなった！？

AndroidStudioでFablicプラグインを導入したときに「Twitter」の欄がなくなってました。

<img width="458" alt="スクリーンショット 2018-01-09 18.23.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/139360/4deb2cff-ea34-eff8-b739-1d8cc43d16ee.png">


FablicでTwitterログイン機能使えなくなったんですかね？
だれかわかる方教えてください。


そこで今回はFablicを使いません。


## Twitterにアプリケーション登録

例のごとくTwitterにアプリケーション登録を行い、FirebaseAuthに登録してください。
詳しくはこちらをご覧ください

https://firebase.google.com/docs/auth/android/twitter-login?hl=ja


## AndroidプロジェクトにTwitterSDKを組み込む

app/build.gradleに下記を追加する

```xml

dependencies {
  compile 'com.twitter.sdk.android:twitter:3.1.1'
  compile 'com.twitter.sdk.android:twitter-mopub:3.1.1'
}

```

組み込んだら上にある `sync now` を押してgradleを読み込ませてください。

これでSDKの組み込み完了です。

## ログイン機能を実装したい `activity` でTwitterの初期設定を行う。


```Kotlin

val config = TwitterConfig.Builder(this)
                .logger(DefaultLogger(Log.DEBUG))
                .twitterAuthConfig(TwitterAuthConfig(CONSUMER_KEY,CONSUMER_SECRET))
                .debug(true)
                .build()
Twitter.initialize(config)
setContentView(R.layout.activity_user_login)

```

`CONSUMER_KEY` と `CONSUMER_SECRET` は各自Twitterにアプリケーション登録したときに取得したものに書き換えてください。


## ログイン処理を書いていく

Viewにボタンを追加する
これ書くだけでいい感じのTwitterログインボタンが生成されます。

```Xml
<com.twitter.sdk.android.core.identity.TwitterLoginButton
            android:id="@+id/login_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
```


ボタンイベントを書いていきます。
FirebaseのmAuthはメンバ変数で持たせておいてください。


```Kotlin

    private lateinit var mAuth: FirebaseAuth

    ・・・・・・・・・・・・・・


        // Firebaseの初期化
        mAuth = FirebaseAuth.getInstance()

        login_button.callback = object : Callback<TwitterSession>() {

            override fun success(result: Result<TwitterSession>?) {
                System.out.println("成功です")

                if (result != null){
                    //ここで成功したあと処理のメソッドを呼ぶ
                    handleTwitterSession(result.data)
                }else{

                  //ここもエラー処理もなんかする
                }
            }

            override fun failure(exception: TwitterException?) {
                System.out.println("失敗です")
            }
        }
```

ログイン処理が成功するとまず最初に下記メソッドが呼ばれます。
その後、onSuccessなどがコールバックされます。

```Kotlin

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        login_button.onActivityResult(requestCode,resultCode,data)
    }
```

最後にFirebaseに登録する処理を書いていきます。

```kotlin
private fun handleTwitterSession(session: TwitterSession) {

        val credential = TwitterAuthProvider.getCredential(
                session.authToken.token,
                session.authToken.secret)

        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this) { task ->
                    if (task.isSuccessful) {

                        // たぶんここでユーザーのユニークキーを取得できる
                        val user = mAuth.currentUser
                    } else {
                        Toast.makeText(this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show()
                    }
                }
    }

```

これでログイン処理が実装できます。


## 全体のActivityクラス

```kotlin

class UserLoginActivity : AppCompatActivity() {

    private lateinit var mAuth: FirebaseAuth

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val config = TwitterConfig.Builder(this)
                .logger(DefaultLogger(Log.DEBUG))
                .twitterAuthConfig(TwitterAuthConfig(CONSUMER_KEY,CONSUMER_SECRET))
                .debug(true)
                .build()
        Twitter.initialize(config)

        setContentView(R.layout.activity_user_login)

        // Firebaseの初期化
        mAuth = FirebaseAuth.getInstance()

        login_button.callback = object : Callback<TwitterSession>() {

            override fun success(result: Result<TwitterSession>?) {
                System.out.println("成功です")

                if (result != null){
                    handleTwitterSession(result.data)
                }else{
                    //エラーハンドリングする
                }
            }

            override fun failure(exception: TwitterException?) {
                System.out.println("失敗です")
                // TODO ここでエラーダイアログを表示させる
            }
        }

    }

    private fun handleTwitterSession(session: TwitterSession) {

        val credential = TwitterAuthProvider.getCredential(
                session.authToken.token,
                session.authToken.secret)

        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this) { task ->
                    if (task.isSuccessful) {

                        // たぶんここでユーザーのユニークキーを取得できる
                        val user = mAuth.currentUser
                    } else {
                        Toast.makeText(this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show()
                    }
                }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        login_button.onActivityResult(requestCode,resultCode,data)
    }

}

```