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

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

POST /api/users/verification/start/
{
  "mobile": "9849735434"
}

以上 API 返回如下响应:

{
  "isVerified": false
}

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

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

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

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

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

【问题讨论】:

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

标签: rest api restful-authentication api-design


【解决方案1】:

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

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

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

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

【讨论】:

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

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

客户端

第 1 步。

服务器端

第 2 步。

第 3 步。

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

客户端

第 4 步。

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

【讨论】:

    【解决方案3】:

    有不同的选择。

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

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

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

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

    "POST /api/users/verification/"
    

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

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

    开始认证:

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

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

    【讨论】:

      猜你喜欢
      • 2014-12-10
      • 2019-10-20
      • 1970-01-01
      • 2020-01-28
      • 1970-01-01
      • 2019-11-03
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      相关资源
      最近更新 更多