[Android] Firebase Authentication使ってみた

今月はFirebaseを触りまくるぞってことで、Firebase Authenticationを使用してみた

# Firebase設定
[公式](https://firebase.google.com/docs/android/setup?hl=ja#console)を参考にプロジェクトの作成とアプリの追加を行った。
1. [Firebase](https://firebase.google.com/)にログインし、プロジェクトを作成します。
2. Android Studioでアプリのプロジェクトを作成
3. 作成したプロジェクトにアプリを追加します。[公式](https://firebase.google.com/docs/android/setup?hl=ja)参照
4. 実装

1、2については詰まることはないと思うので省きます。3で少し躓くかもしれないのでここから説明していきます。
作成したプロジェクト画面のプロジェクト概要で、以下の様なアプリ追加のボタンがありますので、こちらから追加していきます。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289190/d42353ab-280b-cc92-fecf-b75f2fa989ef.png  width=150>
追加するアプリはAndroidを選択すると、
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289190/c1d85b5a-d778-f9c5-2b80-5f6c97b3ad03.png  width=200>
こちらの画面が開くと思います。ここでAndroidパッケージ名を入力するため、予めアプリを作成しておいてください。
デバッグ用の著名証明書は省略可能ですが、ログイン認証で必要になってくると思うので、`Firebase Authentication`を使用する際は設定しなければなりません（多分）。[こちら](https://developers.google.com/android/guides/client-auth)を参考にコマンドを叩けくだけです。

```terminal
keytool -list -v \
-alias androiddebugkey -keystore ~/.android/debug.keystore
```
OR

```terminal
./gradlew signingReport
```

1つ目のコマンドを叩くとキーストアのパスワードを求められますが、デバック用のキーストアのパスワードは、`android`です。後は、説明通りに進めていけば追加できます（説明がとても丁寧なので省きます）。最後にアプリとの接続を確認するフェーズがあるので、そこで待機しておく（しなくてもいい）。

#実装
## Gralde

```gradle.xml
// Project
dependencies {
        // ...
        classpath 'com.google.gms:google-services:4.3.3'
    }

// App
apply plugin: 'com.google.gms.google-services'
dependencies {
    // ...
    // Firebase
    implementation 'com.google.firebase:firebase-auth-ktx:19.4.0'
    implementation 'com.google.firebase:firebase-analytics:17.5.0'
    implementation 'com.google.firebase:firebase-core:17.5.0'

}
```
ここで一旦ビルドすると、接続の確認がとれるはず

## 機能実装
### 認証状況
`FirebaseAuth`をインスタンス化します。

```kotlin
class LoginActivity : AppCompatActivity() {

    private lateinit var auth: FirebaseAuth

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)

        auth = Firebase.auth
       // ...

    }
```
現在の認証状況を確認するためには、`FirebaseAuth`の`currentUser`を取得することにより確認することができます。アプリ起動時にすでに認証済みの場合は、ログイン画面からログアウト画面に遷移するようにしました。

```kotlin
    override fun onStart() {
        super.onStart()
        val currentUser = auth.currentUser
        if (currentUser != null) LogoutActivity.start(this)
    }
```

### 新規登録
メールアドレスとパスワードを使い新規登録する場合は、`auth.createUserWithEmailAndPassword()`を使用します。入力されたメールアドレスとパスワード使って新規登録されます。

```kotlin
    private fun createAccount(email: String, password: String) {

        auth.createUserWithEmailAndPassword(email, password)
            .addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    Log.d(TAG, "createUserWithEmail:success")
                    LogoutActivity.start(this)
                } else {
                    Log.w(TAG, "createUserWithEmail:failure", task.exception)
                    Toast.makeText(
                        this, "Authentication failed.",
                        Toast.LENGTH_SHORT
                    ).show()
                }
            }
    }
```

### ログイン
すでに登録されているメールアドレスとパスワードを使ってログインする場合、`auth.signInWithEmailAndPassword()`を使用します。

```kotlin
    private fun signIn(email: String, password: String) {

        auth.signInWithEmailAndPassword(email, password)
            .addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    Log.d(TAG, "signInWithEmail:success")
                    LogoutActivity.start(this)
                } else {
                    Log.w(TAG, "signInWithEmail:failure", task.exception)
                    Toast.makeText(
                        this, "Authentication failed.",
                        Toast.LENGTH_SHORT
                    ).show()
                }
            }
    }
```

### ログアウト
```kotlin
    private fun signOut() {
         auth.signOut()
    }
```