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

Recommended design for OTP/2FA support in OAuth2

我正在尝试将 OTP/2FA 支持添加到 OAuth2 中,但在阅读了很多 RFC6749 之后,仍然不清楚如何在不违反规范的情况下干净地添加 OTP/2FA .

尽管可以将 OTP/2FA 条目添加到 authorize 对话流中,但没有规定将其添加到 token 中。例如,具有 Resource owner password-based 权限的 public 客户端应用程序可能希望在请求新的 access_token 时直接提供令牌,而不是必须嵌入 HTML 对话框。

因此我的问题是;

提前致谢

RFC 允许扩展(自定义)授权,请参阅 https://www.rfc-editor.org/rfc/rfc6749#section-8.3 部分。该授权可以定义其他属性。

OAuth 2.0 没有定义资源所有者如何向授权服务器进行身份验证,资源所有者密码凭证授权除外。您的提案可以设计为该赠款的扩展变体。

我同意 Hanz Z. 的观点:您可以设计自己的授权类型来使用 OTP。 但 OTP 也可用于客户端身份验证(机密客户端,因为您必须存储凭据)。

例如,我们可以想象令牌请求中的 header (X-OAuth2-OTP = 01234567)。如果客户端激活了 OTP 但未设置 header,则客户端身份验证将失败。

我正在做类似的事情。我有一个端点,您可以在该端点为用户请求某些元数据,例如 2fa / mfa / otp 是否打开以及用于秘密证明/安全远程密码的盐(以及迭代和算法)。

如果你走那条路,你可以简单地用 mfa 或 totp 字段扩展授权类型(这就是我正在做的)。您还可以如上所述创建自定义授权类型(也许更合适)。

另一个解决方案是在授权对话步骤中检查 MFA/2FA/OTP。

如果我完成了我的 OAuth2 实现,我会 link 你也看那个代码,但这里有一些用于身份验证器的库:

您仍然需要提供自己的数据库存储机制并将其 link 到您的 OAuth 实现中,或者您可以制作一个非常简单的机制并将其 运行 作为微服务。

基于特定的范围(例如 OTP),您可以在后端将 bearer(access_token) 标记为“"verified_otp = false"”,然后在授权服务器收到该会话的有效 otp 后标记您的 bearer (access_token) 作为“"verified_otk = true"”。对于您的资源服务器,在授权依赖于此验证的调用之前检查 verified_otk 字段。