Firebase Authentication の SMS 認証
以前、Firebase Authentication の Google 認証を紹介しましたが、今回は SMS 認証について紹介してみようと思います。
認証の流れとしては、まずユーザの電話番号に SMS を送信します。
SMS に確認コードが書かれているので、ユーザはそのコードをアプリに入力します。
アプリはそのコードを Firebase に送ることで、Firebase ユーザが作成されます。
機能の有効化
Firebase コンソールを開き、画面左のメニューから「Authentication」を選択して下さい。
「ログイン方法」タブを選択し、「ログイン プロバイダ」の一覧から「Google」を選択します。
「有効にする」をオンにして、保存ボタンを押します。



SMS 認証の動作確認には実機が必要となりますが、テスト用の電話番号のところに電話番号と確認コードを入力しておくことで、エミュレータで動作テストすることができます。
その場合、SMS は届かないので、確認コードはここで設定したものを使います。
実装
アプリに「電話番号」の入力欄を用意して下さい。
ユーザがボタンを押したときのコールバックなどで、以下の処理を実行すると、ユーザの電話に SMS が送信されます。
PhoneAuthProvider.getInstance().verifyPhoneNumber(phoneNumber, 60, TimeUnit.SECONDS, this, mCallbacks);
verifyPhoneNumber 関数に、電話番号の文字列を渡します。
なお、電話番号は国際電話の形式 (+(国番号)(番号))にする必要があります。
(例. 090-1234-5678 の場合は、+819012345678)
また、リクエストの処理の結果を受け取るコールバックを以下のように実装します。
private PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallbacks;
private String mVerificationId;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
@Override
public void onVerificationCompleted(PhoneAuthCredential credential)
{
Log.d(TAG, "onVerificationCompleted:" + credential);
signInWithPhoneAuthCredential(credential);
}
@Override
public void onVerificationFailed(FirebaseException e)
{
Log.w(TAG, "onVerificationFailed", e);
}
@Override
public void onCodeSent(String verificationId, PhoneAuthProvider.ForceResendingToken token)
{
Log.d(TAG, "onCodeSent:" + verificationId);
mVerificationId = verificationId;
}
};
}
onCodeSent メソッドは、ユーザが指定した電話番号に SMS が送られた際に呼ばれます。
これが呼ばれた時、アプリでは確認コードを入力するための入力欄を表示して、ユーザからの入力を待機します。
onVerificationCompleted メソッドは、確認コードを送信せずに即座に認証が完了するケース (即時確認) と、端末が確認コードを受け取った際に自動的に認証が実行されるケース (自動取得) において呼ばれます。
通常は、onCodeSent メソッドが呼ばれます。
確認コード入力
ユーザがSMSで受け取った確認コードを、アプリに入力してもらいます。
ボタンを押したコールバックなどで、以下の処理を実行します。
PhoneAuthCredential credential = PhoneAuthProvider.getCredential(mVerificationId, code);
signInWithPhoneAuthCredential(credential);
private void signInWithPhoneAuthCredential(PhoneAuthCredential credential)
{
Task<AuthResult> task = mAuth.signInWithCredential(credential);
task.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
Log.d(TAG, "signInWithCredential : success");
} else {
Log.w(TAG, "signInWithCredential : failure", task.getException());
}
}
});
}
signInWithCredential 関数が成功すると、Firebase にユーザが作られています。
作られたユーザは、Firebase コンソールの「Authentication」の「ユーザー」画面で確認できます。
識別子が電話のマークになっています。