在服务器上执行短信验证

如需自动验证电话号码,您必须同时实现验证流程的客户端和服务器部分。本文档介绍了如何实现服务器部分。

电话验证服务器负责以下三项任务:

  1. 构建包含一次性代码的验证消息,其格式符合客户端短信检索器 API 的预期格式
  2. 将验证消息发送到用户的设备
  3. 在将一次性代码发送回服务器并完成后端需要的任何验证后任务时,对其进行验证

您的应用与服务器互动的具体细节由您决定。常见的方法是公开具有两个端点的 REST API:一个端点接收用于验证给定电话号码并发送短信请求的请求,第二个端点接收来自您的应用的一次性代码。

1. 构建验证消息

当您的服务器收到验证电话号码的请求时,请先构建要发送到用户设备的验证消息。此消息必须:

否则,您可以选择任何验证消息的内容。 创建一条消息有助于您稍后轻松提取一次性代码。例如,有效的验证消息可能如下所示:

Your ExampleApp code is: 123ABC78

FA+9qCX9VSu

生成一次性代码

您可以通过多种方式实现一次性代码,只要代码不可猜测,并且在客户端应用将代码发送回服务器时,您可以将这些代码与用户或电话号码相关联。您应该让代码易于输入,以适应任何可能需要用户手动输入代码的情况。

实现一次性代码的一种方法是生成随机数字,您在数据库表中将其用作键。例如,您可能有一个如下所示的 PendingVerifications 表格:

ID 用户 有效期
123456789... 1234 2017 年 3 月 14 日 1:59

您可以将 base32 编码的 ID 用作一次性代码。

计算应用的哈希字符串

Google Play 服务会使用哈希字符串来确定向您的应用发送哪些验证消息。该哈希字符串由应用的软件包名称和应用的公钥证书组成。如需生成哈希字符串,请执行以下操作:

  1. 如果您使用的是 Google Play 应用签名,请从 Google Play 管理中心应用签名部分下载您的应用签名证书 (deployment_cert.der)。

    然后,将应用签名证书导入临时密钥库:

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

    如果您是直接为 APK 签名,请跳过此步骤。

  2. 获取应用签名证书(无论是上面导入的还是您直接为 APK 签名的证书),采用小写十六进制字符串形式。

    例如,如需从上面创建的临时密钥库中获取十六进制字符串,请输入以下命令:

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

    如果您是直接为 APK 签名,请指定生产密钥库和证书别名。

  3. 如果您创建了临时密钥库,请将其删除。

  4. 将十六进制字符串附加到应用的软件包名称中,并用空格分隔。

  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

或者,您也可以使用短信检索器示例应用中的 AppSignatureHelper 类获取应用的哈希字符串。不过,如果您使用辅助类,请务必在获取哈希字符串后将其从应用中移除。请勿在验证消息中使用在客户端上动态计算的哈希字符串。

2. 通过短信发送验证邮件

构建验证消息后,请使用任何短信系统将该消息发送到用户的电话号码。

如需查看示例,请参阅 Twilio 开发者网站上的使用 Twilio SMS 进行应用验证

当用户的设备收到此消息时,系统会将此消息定向到您的应用。您的应用会提取一次性代码并将其发送回服务器,以完成验证流程。

3. 在返回一次性验证码时进行验证

电话号码验证服务器通常具有第二个端点,用于从客户端应用接收一次性代码。当您的服务器在此端点收到应用的一次性代码时,请执行以下操作:

  1. 验证一次性代码是否有效且未过期。
  2. 记录与一次性代码关联的用户已完成电话号码验证。
  3. 移除一次性代码的数据库记录,或以其他方式确保同一代码不可再次使用。

当您记录用户的验证状态并从数据库中移除一次性代码后,验证即告完成。