如何使用 OAuth2、密码流和 OTP?

问题描述

在我的应用程序的初始实现中,我通过密码流使用 OpenIddict 的 ~/connect/token 操作来验证用户用户名和密码。根据 OAuth2 规范,当用户名密码正确时,用户将收到一个带有范围等的令牌。

现在,我将一次性 PIN 引入我的应用 (OTP)。如果用户注册了应用程序,但希望跳过 OTP 验证,他们应该可以这样做。但是这样做时,他们不会收到完整的范围列表——他们只会获得基本范围,直到他们验证他们的帐户。这是因为用户可能被限定为管理员访问权限或其他内容,但在我们验证他们的电子邮件地址为合法之前不应收到该范围。未经验证的客户端应该仍然可以在一定程度上使用该应用,只是不能使用他们的正常权限(如果他们有任何特殊权限)。

据我所知,我无法修改 OpenIdConnectRequest添加 OTP 或类似内容,那么如何使用 OpenIddict 在 OAuth2 密码流中使用 OTP?

(另外,如果阅读以上内容听起来完全是疯狂,我在我的应用程序中引入了可怕的安全漏洞,你只想对着月亮嚎叫,请告诉我。)

解决方法

TLDR:在请求令牌之前切换到授权代码授予并在前端使用 OTP

我建议您迁移到 Authorization code grant 并避免使用资源所有者凭据授予。有两个原因。首先,OAuth 2.1 规范将删除资源所有者凭据授权 (source)。此外,正如您所确定的,OTP 和令牌请求组合不存在。

因此,最好的选择是切换到授权代码授予并在前端使用 OTP。

  1. 请求最终用户凭据
  2. OTP 步骤 - 可以跳过
  3. 令牌请求

绑定 OTP 跳过或提供状态取决于 OpenIddict 实现。