电话号码的 RESTful 设备特定身份验证

Posted

技术标签:

【中文标题】电话号码的 RESTful 设备特定身份验证【英文标题】:RESTful Device specific Authentication of Phone Number 【发布时间】:2018-10-30 23:52:27 【问题描述】:

我们有一个向用户手机号码发送验证码的 API。 API 是:

POST /api/users/verification/start/

  "mobile": "9849735434"

以上 API 返回如下响应:


  "isVerified": false

如果响应为 "isVerified": true,我们不会向用户的手机发送验证码。如果为假,我们发送一个代码。

目前,这一切都只适用于手机号码。我们希望使其基于(移动+设备)以使其更加安全。

为了实现这一点,我们在客户端计算机上存储了一个用户识别 cookie,我们计划在此基础上识别设备。应如何针对这一新要求修改 API?几种方法:

    创建基于 (mobile + cookie) 工作的不同 API,并发送 isVerified: true,前提是两者都与我们数据库中存储的值匹配。 修改现有 API 以实现这一点 - 由于并不总是需要对特定于设备的 OTP 的支持,因此我们必须传递一些标志以使其仅基于移动设备的 OR(移动设备和 cookie)。

我们应该如何设计这样的API来基于移动和设备验证用户?

【问题讨论】:

似乎选项 2 最有意义,API 行为会根据 cookie 的存在而改变。 但我需要相同的 API 来根据客户的要求实现两者,即进行设备特定验证或仅进行基于数字的验证。我应该传递查询字符串来修改服务器端的这种行为吗? cookie 的存在不足以确定用户应该进行设备验证吗?如果不是,它是一个可选参数,那么你可以有明确的 URL,但仍然使用相同的 API,例如/api/users/verification/start/:mode 所以 .../start/mobile.../start/device (如果有道理的话)。 API 可以从 URL 中提取模式并决定如何处理验证。 【参考方案1】:

我会修改现有的 API 以适应新的需求,这是我在修改时要做的重要事情。

    每当您创建任何 API 时,总是会从客户端传递一个“版本”,这样您就可以知道要执行代码的哪一部分。 例如,假设您的移动用户有 2 个不同版本的应用程序,一次在此版本之前,另一次在此版本之后。让两个用户都运行版本控制很有帮助。

    从客户端传递“设备类型”以检查客户端是移动/标签还是其他,这将有多个优点首先您会知道手机/网络中有多少用户群,另一个优点是您可以自定义输出大小因此,与移动应用相比,网络将拥有更多信息。

现在您已经有了设备和版本信息,您只需在现有 API 中编写条件即可。一旦您觉得没有旧版本使用,我们就可以停用这部分 API。

【讨论】:

我们不会对我们的应用程序进行强制更新,因此无法杀死旧版本 API 那就不用杀老版本了,可以根据客户端的版本调用API【参考方案2】:

希望这对您有所帮助,您可以修改代码并遵循一些客户端和服务器步骤。

客户端

第 1 步。

从用户那里获取手机号码和国家 从用户设备获取 UUID。 (UUID:Is Secure.android_ID unique for each device?) 使用此参数点击自己的 Api。

服务器端

第 2 步。

获取验证,这个手机号码是否有效https://github.com/googlei18n/libphonenumber(我们也可以从客户端进行验证)

第 3 步。

生成介于 0001 - 9999 或更多之间的 OTP 根据 OTP 服务提供商的 API,发送 OTP api 调用以在移动号码上发送。 将 OTP no 与 Mobile no 和 UUID 一起保存到数据库中。

客户端

第 4 步。

获取手机号和OTP并点击api 从 DB 中检查 OTP 相同的 OTP 然后响应成功,否则您可以发送错误的 OTP 消息。

【讨论】:

【参考方案3】:

有不同的选择。

    当您想使用 cookie 时,为什么需要单独的 API?如果客户端有cookie,让客户端把这个cookie作为cookie发送。您的服务可以在需要时分析 cookie 并决定进一步的步骤。

    如果您无法发送 cookie 并且第一种方法不适合您: 设备不应该知道,从您的服务的角度来看它是什么类型。这就是为什么我建议使用两种服务 - 一种没有 cookie,另一种有 cookie。

    你说的是“RESTful”。在当前形式中,您的服务不是 RESTful。

A) 使用动词使服务不是 RESTful。例如将其重命名为

"POST /api/users/verification/"

B) 两个操作混合在一个中:检查客户端是否已通过身份验证并开始身份验证过程。把它分成两部分: 检查客户端是否通过身份验证:

"GET /api/users/verification/mobile/9849735434"

开始认证:

"POST /api/users/verification/mobile/9849735434"

在这种情况下,对于 POST,您不需要正文。

【讨论】:

以上是关于电话号码的 RESTful 设备特定身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 电话身份验证 (Flutter) 在某些 iOS 设备中不起作用

Firebase 身份验证 - 无法添加电话号码进行测试

Firebase 电话身份验证失败

IOS:Firebase 电话身份验证在试飞中突然停止工作

未安装 Ionic Firebase 电话身份验证插件

向知道电话号码的特定设备发送推送通知,parse.com