如何使用2因子身份验证(2FA)设计无状态REST登录?

Eri*_* B. 7 authentication rest stateless

我正在努力解决如何使用多因素身份验证设计无状态RESTful身份验证API的概念.

几乎按照定义,2FA的需要需要多个状态; 使用用户名/密码登录,然后提交"代码"(TOTP,SMS代码,验证问题的答案等).这进一步意味着某种有限状态机(FSM).

据我所知,为维持无状态机制而存在的唯一选择是:

  1. 客户端在提交数据以转换到下一个状态时必须传输一些状态信息(例如:当前的FSM状态),
  2. 状态必须保持在服务器端,
  3. 客户端必须在每次请求时传输所有数据,以使其达到当前状态

显然,传输所有数据是荒谬的.因此,这意味着在请求中传输状态信息(不透明或其他)或在服务器上维护状态.

还是有其他一些我缺少的技术?

Eri*_* B. 6

我添加了我想出的解决方案,以防将来对其他人有好处。请注意,在这种情况下,PVQ代表“个人验证问题”(即:基于知识的身份验证)。

最后,我设计了登录端点,要求:

  • 授权标头(这是2FA令牌): Authorization: authType=”PVQ” token=”<tokenid>”
  • 用户名
  • 密码

如果Authorization缺少标头,则端点返回401并设置WWW-Authenticate标头,指示登录需要2FA令牌(即:Authorization标头)。参数可以是PVQ,SMS,TOTP等(基于用户的配置)

WWW-Authenticate : authType="PVQ"
Run Code Online (Sandbox Code Playgroud)

如果客户端收到401 / WWW-Authenticate响应,则它有责任调用2FA端点:

  • 挑战/获取(接收挑战令牌)

    • 客户:发送用户名/密码
    • 服务器:以ID响应,或者
      • 一个问题(PVQ),
      • 或只是通过第三方短信提供商发送发送短信代码
  • 质询/验证(接收Authorization标头所需的2FA令牌)

    • 客户:发送
      • 收到的ID challenge/get
      • 用户名密码
      • 应对挑战(即:对PVQ,SMS代码或TOTP代码的文字回答)
    • 服务器:退货
      • 2FA令牌值

客户端现在可以使用所需的用户名/密码/身份验证令牌来调用登录端点。

最后,没有说客户端返回服务器的“状态”,但是要权衡的是,必须将用户名/密码组合发送到2FA子系统的每个请求。

在服务器端,在发送给用户的SMS代码或PVQ问题的上下文中,有一些状态信息存储在数据库中,以及临时身份验证2FA令牌(单次使用和固定的TTL)。