サーバーで SMS 検証を実行する

電話番号を自動的に確認するには、確認フローのクライアント部分とサーバー部分の両方を実装する必要があります。このドキュメントでは、サーバー部分の実装方法について説明します。

電話認証サーバーは次の 3 つのタスクを行います。

  1. ワンタイム コードを含む確認メッセージを作成し、クライアント側の SMS Retriever API が要求する形式にする
  2. ユーザーのデバイスに確認メッセージを送信する
  3. サーバーに返送されたときにワンタイム コードを検証し、バックエンドで必要な確認後のタスクを完了する

アプリとサーバーとのやり取りの具体的な方法は自由に決めることができます。一般的なアプローチは、2 つのエンドポイントで REST API を公開することです。1 つ目のエンドポイントは、特定の電話番号の確認リクエストを受信して SMS 確認メッセージを送信するエンドポイントで、もう 1 つはアプリからワンタイム コードを受信するエンドポイントです。

1. 確認メッセージを作成する

サーバーが電話番号の確認リクエストを受信すると、まずユーザーのデバイスに送信する確認メッセージを作成します。このメッセージは、次のようにする必要があります。

それ以外の場合、確認メッセージの内容は自由に指定できます。 後でワンタイム コードを簡単に抽出できるメッセージを作成すると、役立ちます。たとえば、有効な確認メッセージは次のようになります。

Your ExampleApp code is: 123ABC78

FA+9qCX9VSu

ワンタイム コードの生成

ワンタイム コードはさまざまな方法で実装できます。ただし、コードが推測不可能であり、クライアント アプリからサーバーにコードを返送する際に、コードをユーザーまたは電話番号にリンクできます。ユーザーが手動でコードを入力しなければならない状況に対応するため、入力しやすいコードにする必要があります。

ワンタイム コードを実装する 1 つの方法は、データベース テーブルのキーとして使用する乱数を生成することです。たとえば、次のような PendingVerifications テーブルがあるとします。

ID ユーザー 有効期限
123456789... 1234 2017-3-14 1:59

base32 でエンコードされた ID をワンタイム コードとして使用できます。

アプリのハッシュ文字列を計算する

Google Play 開発者サービスはハッシュ文字列を使用して、アプリに送信する確認メッセージを決定します。ハッシュ文字列は、アプリのパッケージ名とアプリの公開鍵証明書で構成されます。ハッシュ文字列を生成するには:

  1. Google Play アプリ署名を使用している場合は、Google Play Console の [アプリの署名] セクションからアプリ署名証明書(deployment_cert.der)をダウンロードします。

    次に、アプリ署名証明書を一時キーストアにインポートします。

    keytool -importcert -file deployment_cert.der -keystore temporary.keystore -alias PlayDeploymentCert
    

    APK に直接署名する場合は、この手順をスキップしてください。

  2. アプリ署名証明書(上記でインポートした証明書、または APK の直接署名に使用した証明書のいずれか)を小文字の 16 進文字列として取得します。

    たとえば、上記で作成した一時的なキーストアから 16 進文字列を取得するには、次のコマンドを入力します。

    keytool -exportcert -keystore temporary.keystore -alias PlayDeploymentCert | xxd -p | tr -d "[:space:]"
    

    APK に直接署名する場合は、本番環境のキーストアと証明書エイリアスを指定します。

  3. 一時的なキーストアを作成した場合は、それを削除します。

  4. アプリのパッケージ名の最後に 16 進数文字列を単一のスペースで区切って追加します。

  5. 結合された文字列の SHA-256 合計を計算します。SHA-256 合計を計算する前に、文字列から先頭や末尾の空白文字を削除してください。

  6. SHA-256 の合計のバイナリ値を Base64 でエンコードします。最初に、出力形式から SHA-256 合計をデコードすることが必要になる場合があります。

  7. アプリのハッシュ文字列は、base64 でエンコードされたハッシュの最初の 11 文字です。

次のコマンドは、アプリの本番環境キーストアからハッシュ文字列を計算します。

keytool -exportcert -alias PlayDeploymentCert -keystore MyProductionKeys.keystore | xxd -p | tr -d "[:space:]" | echo -n com.example.myapp `cat` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11

または、SMS 取得サンプルアプリから AppSignatureHelper クラスを使用してアプリのハッシュ文字列を取得することもできます。ただし、ヘルパークラスを使用している場合は、ハッシュ文字列の取得後にアプリからそのヘルパークラスを削除してください。クライアントで動的に計算されるハッシュ文字列を確認メッセージに使用しないでください。

2. SMS で認証メッセージを送信する

確認メッセージを作成したら、SMS システムを使用して、ユーザーの電話番号にメッセージを送信します。

たとえば、Twilio のデベロッパー サイトの Twilio SMS を使用したアプリ確認をご覧ください。

ユーザーのデバイスがこのメッセージを受け取ると、メッセージはアプリに転送されます。アプリはワンタイム コードを抽出して、サーバーに返送し、検証プロセスを完了します。

3. ワンタイム コードが返されたら確認する

通常、電話番号確認サーバーには 2 つ目のエンドポイントがあり、クライアント アプリからワンタイム コードを返すために使用されます。サーバーがこのエンドポイントでアプリからワンタイム コードを受信したら、次の操作を行います。

  1. ワンタイム コードが有効であり、有効期限が切れていないことをご確認ください。
  2. ワンタイム コードにリンクしているユーザーが電話番号の確認を完了したことを記録します。
  3. ワンタイム コードのデータベース レコードを削除するか、同じコードを再度使用できないようにします。

ユーザーの確認ステータスを記録し、データベースからワンタイム コードを削除すると、検証が完了します。