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

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

電話検証サーバーは、次の3つのタスクを担当します。

  1. ワンタイムコードを含み、クライアント側のSMSレトリーバー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を1回限りのコードとして使用できます。

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

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

  1. Google Playによるアプリ署名を使用する場合は、 Google Playコンソールのアプリ署名セクションからアプリ署名証明書( 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進文字列をアプリのパッケージ名に1つのスペースで区切って追加します。

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

  6. Base64-SHA-256合計のバイナリ値をエンコードします。最初に、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の開発者サイトでTwilioSMSを使用したアプリの検証を参照してください。

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

3.返されたワンタイムコードを確認します

電話番号検証サーバーには通常、クライアントアプリからワンタイムコードを受信するために使用する2番目のエンドポイントがあります。サーバーがこのエンドポイントでアプリからワンタイムコードを受信したら、次の手順を実行します。

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

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