【问题标题】:How can I use OAuth2, the Password Flow, and OTP?如何使用 OAuth2、密码流和 OTP?
【发布时间】:2021-05-12 03:48:39
【问题描述】:

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

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

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

(另外,如果阅读上述内容听起来像是纯粹的精神错乱,并且我在我的应用程序中引入了可怕的安全漏洞,那么你只想对着月亮嚎叫,请告诉我。)

【问题讨论】:

    标签: oauth-2.0 oauth openiddict


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢卡文杜!我无法切换到授权码授予。我在我的项目中使用 Flutter for Web,它无法通过回调接受令牌。但你的回答可能是解决这个问题的正确方法,所以我接受了。谢谢?
    • @LewisCianci 嗯,授权代码流程不需要您通过回调接受令牌。但它要求您接受重定向并接受授权码。我确信有解决方案来解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2022-07-07
    • 2023-03-24
    • 1970-01-01
    • 2017-05-09
    • 2017-06-22
    • 2020-06-06
    • 2018-09-20
    • 1970-01-01
    相关资源
    最近更新 更多