OAuth2中OTP / 2FA支持的推荐设计

时间:2015-09-29 01:07:26

标签: oauth-2.0

我正在尝试向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。

  • 还有其他方法我忽略了吗?

提前谢谢

4 个答案:

答案 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的库:

您仍然需要提供自己的数据库存储机制并将其链接到您的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字段,然后再授权依赖此验证的调用。