我正在尝试向OAuth2添加OTP / 2FA支持,但经过RFC6749的大量阅读后,仍然不清楚如何在不违反规范的情况下干净地添加OTP / 2FA。
虽然可以在authorize
对话框流中添加OTP / 2FA条目,但没有将其添加到token
中的规定。例如,具有public
权限的Resource owner password-based
客户端应用可能希望在请求新的access_token
时直接提供令牌,而不必嵌入HTML对话框。
因此,我的问题是;
RFC是否允许自定义grant_type
?这应该用于提供2FA / OTP功能吗?
RFC是否允许现有grant_type
的其他属性?例如,grant_type=token&otp_code=1234
(RFC未明确说明规范中grant_type
是否允许其他属性)
是否应将OTP功能放入标题?这是Github used的方法,但感觉非常丑陋/ hacky。
还有其他方法我忽略了吗?
提前谢谢
答案 0 :(得分:1)
RFC允许扩展(自定义)授权,请参阅https://tools.ietf.org/html/rfc6749#section-8.3部分。该授权可以定义其他属性。
OAuth 2.0未定义资源所有者如何向授权服务器进行身份验证,但资源所有者密码凭据授予除外。您的提案可以设计为该授权的扩展变体。
答案 1 :(得分:1)
我正在做类似的事情。我有一个端点,您可以在该端点为用户请求某些元数据,例如是否打开2fa / mfa / otp,以及使用密码证明/安全远程密码的盐(以及迭代和算法)。
如果你走那条路,你可以简单地用mfa或totp字段扩展授权类型(这就是我正在做的事情)。您还可以创建如上所述的自定义授权类型(可能更合适)。
另一种解决方案是在授权对话步骤中检查MFA / 2FA / OTP。
如果我完成了我的OAuth2实现,我也会将您链接到该代码,但这里有一些Authenticator的库:
Browser Authenticator包含您在浏览器中生成并验证密钥和令牌所需的组件:https://git.coolaj86.com/coolaj86/browser-authenticator.js
Node Authenticator有补充的服务器端代码:https://git.coolaj86.com/coolaj86/node-authenticator.js
您仍然需要提供自己的数据库存储机制并将其链接到您的OAuth实现,或者您可以制作一个非常简单的存储机制并将其作为微服务运行。
答案 2 :(得分:0)
我同意Hanz Z。:您可以设计自己的授权类型以消耗OTP。 但OTP也可用于客户端身份验证(保密客户端,因为您必须存储凭据)。
例如,我们可以想象令牌请求中的标头(X-OAuth2-OTP
= 01234567)。如果客户端激活OTP但未设置标头,则客户端验证将失败。
答案 3 :(得分:0)
基于特定范围(例如OTP),您可以在后端将Bearer(access_token)标记为““ verified_otp = false”“,然后在授权服务器收到该会话的有效otp之后,将您的Bearer(access_token)标记为”“ authentic_otk = true“”。对于您的资源服务器,请先检查authenticated_otk字段,然后再授权依赖此验证的调用。