我正在努力解决如何使用多因素身份验证设计无状态RESTful身份验证API的概念.
几乎按照定义,2FA的需要需要多个状态; 使用用户名/密码登录,然后提交"代码"(TOTP,SMS代码,验证问题的答案等).这进一步意味着某种有限状态机(FSM).
据我所知,为维持无状态机制而存在的唯一选择是:
客户端在提交数据以转换到下一个状态时必须传输一些状态信息(例如:当前的FSM状态),
状态必须保持在服务器端,
客户端必须在每次请求时传输所有数据,以使其达到当前状态
显然,传输所有数据是荒谬的.因此,这意味着在请求中传输状态信息(不透明或其他)或在服务器上维护状态.
还是有其他一些我缺少的技术?
我添加了我想出的解决方案,以防将来对其他人有好处。请注意,在这种情况下,PVQ代表“个人验证问题”(即:基于知识的身份验证)。
最后,我设计了登录端点,要求:
授权标头(这是2FA令牌): Authorization: authType=”PVQ”
token=”
用户名
密码
如果Authorization
缺少标头,则端点返回401并设置WWW-Authenticate
标头,指示登录需要2FA令牌(即:Authorization标头)。参数可以是PVQ,SMS,TOTP等(基于用户的配置)
WWW-Authenticate : authType="PVQ"
如果客户端收到401 / WWW-Authenticate响应,则它有责任调用2FA端点:
挑战/获取(接收挑战令牌)
客户:发送用户名/密码
服务器:以ID响应,或者
一个问题(PVQ),
或只是通过第三方短信提供商发送发送短信代码
质询/验证(接收Authorization
标头所需的2FA令牌)
客户:发送
收到的ID challenge/get
用户名密码
应对挑战(即:对PVQ,SMS代码或TOTP代码的文字回答)
服务器:退货
2FA令牌值
客户端现在可以使用所需的用户名/密码/身份验证令牌来调用登录端点。
最后,没有说客户端返回服务器的“状态”,但是要权衡的是,必须将用户名/密码组合发送到2FA子系统的每个请求。
在服务器端,在发送给用户的SMS代码或PVQ问题的上下文中,有一些状态信息存储在数据库中,以及临时身份验证2FA令牌(单次使用和固定的TTL)。