我正在实现一个系统,用户可以在其中通过第三方系统调用授权。身份验证可能需要很长时间才能完成。发生的情况是,用户必须在手机上打开一个应用程序,然后输入代码。
从API角度来看,现在的流程如下:
请求:
POST /登录
body:{“ user”:“ alice”}
响应:(10-20秒后)
body:{“ status”:“ success”,“ token”:“ valid.jwt.token”}
问题是,前端客户端必须保持连接打开很长时间,这对我来说似乎是一种反模式。连接将打开10-20秒。
我想做的就是改变其工作方式,而改为这样:
请求:
POST /登录
body:{“ user”:“ alice”}
响应:(立即)
body:{“ uuid”:“ auth_request_id”,}
然后,用户将轮询GET / auth / {auth_request_id}端点,该端点将以身份验证的CURRENT状态进行响应。
例如,这就是用户打开电话身份验证应用程序之前响应的样子。
回复:
GET / auth / {auth_request_id}
body:{“就绪”:false,“状态”:“ user_opened_app”}
这是他们成功完成电话流程后的结果:
回复:
GET / auth / {auth_request_id}
body:{“ ready”:true,“ state”:“ finished”,“ token”: “ valid.jwt”令牌“}
我在线研究了该主题,并遇到了OAuth 2和所有其他标准,但它们不适合我的用例。
原因是用户将停留在登录表单所在的页面上,并且根本不执行任何重定向。然后,他将打开另一台设备(手机),在该设备上执行2因子验证。
我想向用户动态显示其授权状态。例如,如果用户尚未打开该应用程序,我想告诉他这样做。此外,我想通过摆脱持久的HTTPS连接来提高登录系统的弹性。使用此轮询解决方案,如果一台api服务器出现故障,另一台api服务器将响应并根据请求UUID接管。
我唯一的问题是知道这样的设置是否安全。我知道,如果有人偷了uuid的uuid并开始轮询GET / login / {uuid}端点,那么他们从理论上可以窃取最终的JWT令牌。
我将如何设计此流程以确保安全?还是该设计可安全进行身份验证?
最后,如果有人窃取了您的Cookie或JWT,无论如何他们都会拥有您的身份验证详细信息-因此也许无法防止这种情况。
注意:假设流量总是通过HTTPS发生,因此网络数据包捕获不会窃取UUID。