【问题标题】:Oauth2 Single-Page Apps Security ConsiderationsOauth2 单页应用程序安全注意事项
【发布时间】:2020-08-26 01:26:35
【问题描述】:

当我发现以下声明时,我正在阅读 Oauth.com 网站,试图了解如何在单页应用程序中实现安全性:

“没有客户端密码的授权码授予安全的唯一方法是使用“状态”参数并将重定向 URL 限制为受信任的客户端。由于未使用密码,因此无法验证身份客户端,而不是使用已注册的重定向 URL。"

如果我理解正确,他说我可以使用注册的重定向 URL 验证我的 SPA 的身份。

问题 1:如果我将授权代码重定向到 url(Web 服务器),我如何才能在浏览器中运行的 SPA 中获取它(或访问令牌或受保护的资源)?

问题2:在这个注册的url可以做什么样的检查来验证我的SPA身份?

【问题讨论】:

    标签: api security oauth-2.0 authorization single-page-application


    【解决方案1】:

    第一季度。您会在查询参数中收到一个授权码作为登录响应。然后将其换成访问令牌。然后使用访问令牌调用 API。

    第二季度。使用 HTTPS 证明您拥有重定向 URI。使用 PKCE 在运行时创建一次性使用密钥。

    我的资源

    也许这些资源会给你一个更清晰的想法 - 随时发布任何后续问题..

    【讨论】:

    • 在您的第一个答案中,登录只会发生一次,并且该令牌将在登录后用于多个 API 调用。这是正确的做法吗?
    • 没错——要查看有效的 SPA,您可以登录我的 quick start page 上的代码示例,也可以在 Fiddler 等工具中查看消息。
    • 关于第二个答案,HTTPS可能证明我拥有重定向url,但我看不到它如何证明发出授权请求的SPA的身份。
    • PKCE 是用来证明发起登录请求的客户端是使用登录结果的同一方。请参阅上述消息工作流的第 4、8 和 9 步。
    【解决方案2】:

    授权代码作为code 查询参数包含在URL 中,因此您可以从SPA 访问它(例如使用window.location.search)。这将取决于 OAuth2 提供者是否能够将该代码交换为来自您的 SPA 的访问令牌。

    如果您使用网络服务器进行代码->令牌交换,您需要将令牌放入您的 SPA 有权访问的数据库中。

    来自 OAuth.com 的引用提到了两个安全措施,state 参数和注册的重定向 URL。这些可以防止两种不同的攻击:

    1. state 参数可防止攻击者使用带有被盗授权代码的 URL 来检索受害用户的访问令牌并将其与攻击者的帐户相关联。通过验证 URL 中的 state 参数是否与您提供给授权服务器的 state 相同,您可以确定重定向是由授权服务器生成的,而不是攻击者。

    2. 注册的重定向 URL 可防止攻击者使用您的客户端 ID,但会将用户发送到授权 URL,授权后,该 URL 会将他们重定向到攻击者的 Web 服务器而不是您的 Web 服务器,从而允许攻击者检索用户的访问令牌。使用已注册的重定向 URL,授权服务器将重定向到您控制的预注册重定向 URL,而不会重定向到攻击者的 Web 服务器。

    您自己实现此流程的另一种方法是使用托管 OAuth 服务,特别是对于 SPA,它对可用的 OAuth 授权类型有限制。我工作的Xkit 旨在与 SPA 一起使用,并将所有 OAuth 流程(包括安全考虑)移出您的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多