Android + Kotlin で Firebaseによるメール認証

久々にAndroid。Androidにかかわらず、何かサービスなりアプリケーションなり作成しようとすると、ログインの仕組みだとか作るのが面倒くさい、というかそのあたりを作り上げると力尽きてそもそも何がしたかったのかわからなくなることがままある。

自分を含め、という人のために、Baas(Backend as a service) という、バックエンド機構をサービスとして提供する考え方があり、GoogleのBaas、Firebaseを使用して、Androidアプリにメール認証機能を組み込む。

1.Firebaseアカウントを作成しメール認証を有効化

Firebaseにアカウントを登録して、プロジェクトを登録。無料で始められる

https://firebase.google.com/?hl=ja

firebase_auth_getstart

ログインプロバイダ、メール/パスワードを有効にする

firebase_auth_mail_enable

2.Android Studio でプロジェクトを作成しFirebaseアシスタントを使用

https://firebase.google.com/docs/android/setup?authuser=0

Tools から、Firebaseを選択すると、画面の右にチュートリアルが起動

firebase_assistant

Authentication の、Email and password authentication を展開

firebase_assistant2

ウィザード形式で手順が表示されるので、それに従う。

JavaのサンプルコードをなれないKotlinに読み替えつつ。

3.プログラムの作成

とりあえず、画面にメールアドレスとパスワード入力欄、ユーザー作成と、サインインボタンを配置し、MainActivityに上記チュートリアルのコードをKotlinに読み替えつつ、動作を簡易に確認できるレベルで実装してみる。

package info.typea.sentence2

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import com.google.android.gms.tasks.Task
import com.google.firebase.auth.AuthResult
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.FirebaseUser

class MainActivity : AppCompatActivity() {
    companion object {
        const val TAG: String = "MainActivity"
    }
    private var mAuth: FirebaseAuth? = null

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

        mAuth = FirebaseAuth.getInstance()

        // ユーザー登録ボタン
        var btnCreate: Button = findViewById<Button>(R.id.btnCreate) as Button
        btnCreate.setOnClickListener{
            var email = (this.findViewById<EditText>(R.id.txtEmail) as EditText).text.toString()
            var password = (this.findViewById<EditText>(R.id.txtPassword) as EditText).text.toString()
            Log.i(TAG, String.format("create email=%s, password%s", email, password))
            createUserWithEmailAndPassword(email, password )
        }

        // サインインボタン
        var btnSignIn: Button = findViewById<Button>(R.id.btnSignIn) as Button
        btnSignIn.setOnClickListener{
            var email = (this.findViewById<EditText>(R.id.txtEmail) as EditText).text.toString()
            var password = (this.findViewById<EditText>(R.id.txtPassword) as EditText).text.toString()
            Log.i(TAG, String.format("signin email=%s, password%s", email, password))
            signInWithEmailAndPassword(email, password)
        }
    }

    override fun onStart() {
        super.onStart()

        var currentUser = mAuth?.currentUser
        updateUI(currentUser)
    }

    // 画面表示更新
    private fun updateUI(currentUser:FirebaseUser?) {
        Log.i(TAG, String.format("update ui user=%s", currentUser?.email.toString()))
        (findViewById<TextView>(R.id.lblUser) as TextView).text = currentUser?.email.toString()
    }

    // ユーザー登録処理
    private fun createUserWithEmailAndPassword(email: String, password: String) {
        mAuth?.createUserWithEmailAndPassword(email, password)?.addOnCompleteListener{
            task: Task<AuthResult> ->
                if (task.isSuccessful) {
                    Log.d(TAG, "createUserWithEmail:success")
                    var user = mAuth?.currentUser
                    updateUI(user)
                } else {
                    Log.w(TAG, "createUserWithEmail:failure")
                    Toast.makeText(this, "Authentication failed",Toast.LENGTH_SHORT).show()
                    updateUI(null)
                }
        }
    }

    // サインイン処理
    private fun signInWithEmailAndPassword(email: String, password: String) {
        mAuth?.signInWithEmailAndPassword(email, password)?.addOnCompleteListener{
            task: Task<AuthResult> ->
                if(task.isSuccessful) {
                    Log.d(TAG, "signInWithEmail:success")
                    var user = mAuth?.currentUser
                    updateUI(user)
                } else {
                    Log.w(TAG, "signInWithEmail:failure")
                    Toast.makeText(this, "Authentication failed",Toast.LENGTH_SHORT).show()
                    updateUI(null)
                }
        }
    }
}

4.実行

メールアドレスとパスワード(6桁以上)を設定し、CREATEボタンを押下

処理が成功して、画面最上段にメールアドレスが表示された。

firebase_auth_screen

Firebaseの管理画面上にも、入力したメールアドレスが登録された!

これは捗る。

firebase_auth_success