在服务器上执行短信验证

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

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

  1. 构造包含一次性验证码且采用客户端 SMS Retriever API 预期格式的验证消息
  2. 将验证消息发送到用户的设备
  3. 在将一次性代码发送回服务器时对其进行验证,并完成后端要求的所有验证后任务

您的应用与服务器交互的具体方式由您决定。一种常见的方法是公开具有两个端点的 REST API:一个端点接收验证给定电话号码的请求并发送短信验证消息,另一个端点从您的应用接收一次性验证码。

1. 撰写验证消息

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

  • 长度不超过 140 字节
  • 包含客户端要发送回您的服务器的一次性代码,用于完成验证流程(请参阅生成一次性代码
  • 添加用于标识应用的 11 个字符的哈希字符串(请参阅计算应用的哈希字符串

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

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 短信验证应用

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

3. 验证系统返回的一次性验证码

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

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

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