如需自动验证电话号码,您必须同时实现验证流程的客户端和服务器部分。本文档介绍了如何实现服务器部分。
电话验证服务器负责以下三项任务:
- 构建包含一次性代码的验证消息,其格式符合客户端短信检索器 API 的预期格式
- 将验证消息发送到用户的设备
- 在将一次性代码发送回服务器并完成后端需要的任何验证后任务时,对其进行验证
您的应用与服务器互动的具体细节由您决定。常见的方法是公开具有两个端点的 REST API:一个端点接收用于验证给定电话号码并发送短信请求的请求,第二个端点接收来自您的应用的一次性代码。
1. 构建验证消息
当您的服务器收到验证电话号码的请求时,请先构建要发送到用户设备的验证消息。此消息必须:
- 长度不超过 140 字节
- 包含客户端发送回服务器以完成验证流程的一次性代码(请参阅生成一次性代码)
- 添加一个识别应用的 11 个字符的哈希字符串(请参阅计算应用的哈希字符串)
否则,您可以选择任何验证消息的内容。 创建一条消息有助于您稍后轻松提取一次性代码。例如,有效的验证消息可能如下所示:
Your ExampleApp code is: 123ABC78FA+9qCX9VSu
生成一次性代码
您可以通过多种方式实现一次性代码,只要代码不可猜测,并且在客户端应用将代码发送回服务器时,您可以将这些代码与用户或电话号码相关联。您应该让代码易于输入,以适应任何可能需要用户手动输入代码的情况。
实现一次性代码的一种方法是生成随机数字,您在数据库表中将其用作键。例如,您可能有一个如下所示的 PendingVerifications 表格:
ID | 用户 | 有效期 |
---|---|---|
123456789... | 1234 | 2017 年 3 月 14 日 1:59 |
您可以将 base32 编码的 ID 用作一次性代码。
计算应用的哈希字符串
Google Play 服务会使用哈希字符串来确定向您的应用发送哪些验证消息。该哈希字符串由应用的软件包名称和应用的公钥证书组成。如需生成哈希字符串,请执行以下操作:
如果您使用的是 Google Play 应用签名,请从 Google Play 管理中心的应用签名部分下载您的应用签名证书 (
deployment_cert.der
)。然后,将应用签名证书导入临时密钥库:
keytool -importcert -file deployment_cert.der -keystore temporary.keystore -alias PlayDeploymentCert
如果您是直接为 APK 签名,请跳过此步骤。
获取应用签名证书(无论是上面导入的还是您直接为 APK 签名的证书),采用小写十六进制字符串形式。
例如,如需从上面创建的临时密钥库中获取十六进制字符串,请输入以下命令:
keytool -exportcert -keystore temporary.keystore -alias PlayDeploymentCert | xxd -p | tr -d "[:space:]"
如果您是直接为 APK 签名,请指定生产密钥库和证书别名。
如果您创建了临时密钥库,请将其删除。
将十六进制字符串附加到应用的软件包名称中,并用空格分隔。
计算组合字符串的 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
或者,您也可以使用短信检索器示例应用中的 AppSignatureHelper 类获取应用的哈希字符串。不过,如果您使用辅助类,请务必在获取哈希字符串后将其从应用中移除。请勿在验证消息中使用在客户端上动态计算的哈希字符串。
2. 通过短信发送验证邮件
构建验证消息后,请使用任何短信系统将该消息发送到用户的电话号码。
如需查看示例,请参阅 Twilio 开发者网站上的使用 Twilio SMS 进行应用验证。
当用户的设备收到此消息时,系统会将此消息定向到您的应用。您的应用会提取一次性代码并将其发送回服务器,以完成验证流程。
3. 在返回一次性验证码时进行验证
电话号码验证服务器通常具有第二个端点,用于从客户端应用接收一次性代码。当您的服务器在此端点收到应用的一次性代码时,请执行以下操作:
- 验证一次性代码是否有效且未过期。
- 记录与一次性代码关联的用户已完成电话号码验证。
- 移除一次性代码的数据库记录,或以其他方式确保同一代码不可再次使用。
当您记录用户的验证状态并从数据库中移除一次性代码后,验证即告完成。