在服务器上执行SMS验证

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

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

  1. 构造包含一次性代码并具有客户端SMS Retriever API期望格式的验证消息
  2. 将验证消息发送到用户的设备
  3. 验证一次性代码发送回服务器后,并完成后端所需的所有验证后任务

您的应用如何与服务器交互的具体方式取决于您。一种常见的方法是公开具有两个端点的REST API:一个端点接收验证给定电话号码的请求并发送SMS验证消息,第二个端点从应用程序接收一次性代码。

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. 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类获取应用程序的哈希字符串。但是,如果使用helper类,请确保在获取哈希字符串后将其从应用程序中删除。请勿在验证消息中使用在客户端上动态计算的哈希字符串。

2.通过短信发送验证信息

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

例如,请参阅Twilio的开发人员网站上的使用Twilio SMS进行的应用程序验证

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

3.验证一次返回的代码

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

  1. 验证一次性代码有效且尚未过期。
  2. 记录链接到一次性代码的用户已完成电话号码验证。
  3. 删除一次性代码的数据库记录,或以其他方式确保不再使用相同的代码。

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