電話番号を自動的に検証するには、検証フローのクライアント部分とサーバー部分の両方を実装する必要があります。このドキュメントでは、サーバー部分の実装方法について説明します。
電話確認サーバーは、次の 3 つのタスクを行います。
- 1 回限りのコードを含む確認メッセージを作成し、クライアント側の SMS Retriever API で想定される形式にする。
- 確認メッセージをお客様のデバイスに送信する
- サーバーに返送されるときにワンタイム コードを検証し、バックエンドに必要な検証後タスクを完了します。
アプリがサーバーとどのようにやり取りするかは、デベロッパーが自由に決定できます。一般に、2 つのエンドポイントを持つ REST API を公開します。1 つは特定の電話番号の確認リクエストを受信して SMS 確認メッセージを送信し、もう 1 つはアプリからワンタイム コードを受信するエンドポイントです。
1. 確認メッセージを作成する
サーバーが電話番号の確認リクエストを受け取ったら、まず確認メッセージを作成し、これをユーザーのデバイスに送信します。このメッセージは次の条件を満たす必要があります。
- 140 バイト以下
- 確認フローを完了するためにクライアントがサーバーに送り返すワンタイム コードを含めます(ワンタイム コードの生成をご覧ください)。
- アプリを識別する 11 文字のハッシュ文字列を含めます(アプリのハッシュ文字列の計算をご覧ください)。
それ以外の場合は、任意の内容を選択できます。 後で 1 回限りのコードを簡単に抽出できるメッセージを作成すると便利です。たとえば、有効な確認メッセージは
Your ExampleApp code is: 123ABC78のようになります。FA+9qCX9VSu
ワンタイム コードの生成
推測できないコードや、クライアント アプリがサーバーに送り返す際に電話番号をユーザーまたは電話番号にリンクできる場合に限り、さまざまな方法でワンタイム コードを実装できます。ユーザーがコードを手動で入力しなければならない可能性がある状況に対応するため、コードを簡単に入力できるようにする必要があります。
ワンタイム コードを実装する方法の 1 つは、乱数を生成し、それをデータベース テーブルのキーとして使用することです。たとえば、PendingVerifications テーブルは次のようになります。
ID | ユーザー | 有効期限 |
---|---|---|
123456789... | 1234 | 2017-3-14 1:59 |
base32 でエンコードされた ID は、ワンタイム コードとして使用できます。
アプリのハッシュ文字列の計算
Google Play 開発者サービスは、ハッシュ文字列を使用して、アプリに送信する確認メッセージを決定します。ハッシュ文字列は、アプリのパッケージ名とアプリの公開鍵証明書で構成されます。ハッシュ文字列を生成するには:
Google Play アプリ署名を使用している場合は、Google Play Console の [アプリ署名] セクションからアプリ署名証明書(
deployment_cert.der
)をダウンロードします。次に、アプリ署名証明書を一時的なキーストアにインポートします。
keytool -importcert -file deployment_cert.der -keystore temporary.keystore -alias PlayDeploymentCert
APK を直接署名する場合は、この手順をスキップします。
アプリ署名証明書(上でインポートしたものまたは APK の直接署名に使用したもの)を小文字の 16 進文字列で取得します。
たとえば、上記で作成した一時キーストアから 16 進文字列を取得するには、次のコマンドを入力します。
keytool -exportcert -keystore temporary.keystore -alias PlayDeploymentCert | xxd -p | tr -d "[:space:]"
APK に直接署名する場合は、本番環境のキーストアと証明書のエイリアスを指定します。
一時的なキーストアを作成した場合は、それを削除します。
アプリのパッケージ名に、単一のスペースで区切った 16 進文字列を追加します。
結合された文字列の SHA-256 の合計を計算します。SHA-256 の合計を計算する前に、先頭または末尾の空白を文字列から削除してください。
SHA-256 の合計のバイナリ値を Base64 エンコードします。最初に出力形式から SHA-256 の合計をデコードしなければならない場合があります。
アプリのハッシュ文字列は、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 を使用したアプリの確認をご覧ください。
ユーザーのデバイスがこのメッセージを受信すると、メッセージはアプリに転送されます。アプリは 1 回限りのコードを抽出し、検証プロセスを完了するため、サーバーにコードを返します。
3. 返品時にワンタイム コードを確認する
通常、電話番号確認サーバーには 2 つ目のエンドポイントがあります。このエンドポイントを使用して、クライアント アプリから 1 回限りのコードを受け取ります。サーバーがこのエンドポイントでアプリからワンタイム コードを受け取ったら、次の操作を行います。
- ワンタイム コードが有効で、期限切れになっていないことを確認します。
- ワンタイム コードにリンクされているユーザーが電話番号の確認を完了した記録。
- 1 回限りのコードのデータベース レコードを削除するか、別の方法で同じコードが再び使用されないようにしてください。
ユーザーの確認ステータスを記録して、データベースからワンタイム コードを削除すると、確認は完了です。