为什么要使用代理在密码授权调用中隐藏 OAuth 客户端凭据?

信息安全 api 验证 oauth 代理人
2021-08-13 04:54:44

Alex Bilbie 2014 年11 月的一篇文章中,建议 OAuth 用户在执行资源所有者密码授权调用时不要让客户端发送其凭据 (client_id和)。我理解的想法是,为了让客户端能够将其凭据添加到其请求中,这些凭据必须写入其源代码(通常是 HTML/JS)中,因此可能的攻击者可以访问,然后可以使用它们来对模拟客户端的 API 执行调用。client_secret

另一篇博文的评论中,作者补充道:

如果我可以查看源代码并复制客户端凭据,则没有什么能阻止我构建自己的应用程序,该应用程序可以针对您的 OAuth 服务进行身份验证,然后调用 API。

建议的解决方法是客户端不应直接调用 API,而是使用瘦代理负责将客户端凭据附加到请求,然后将其转发到 API。

作为一个天真的 OAuth 新手,我不明白为什么这会阻止攻击者执行对我的 API 的调用。如果客户端不必将其凭据添加到其请求中,则没有人这样做。由于代理会自动添加凭据,因此发送到 API 的任何请求都会被视为来自授权客户端。

有人在 Twitter 上向 Alex Bilbie提出这个问题这是他的回答:

您将如何保护代理?攻击者不能只是向代理发送请求并愉快地填写秘密吗?

关键是您隐藏了后端的实现细节,因此保留了更多控制权

如果有人能详细说明这个答案,我将不胜感激,因为我看不到我可以从隐藏实现细节中获得什么(安全方面),同时消除客户端对自身进行身份验证的需要。

1个回答

在阅读了链接的博客文章并交叉引用了他与OAuth 2.0 RFC的问题之后,我对他的担忧有一些疑问。在他博客文章的第一部分中,他在使用资源所有者密码凭据授予的单页 Web 应用程序中使用 OAuth 时遇到了两个主要问题

  1. 和被烘焙client_idclient_secretJavascript 中。
  2. 攻击者还可以从 Javascript访问access_token和。refresh_token

针对第一个问题, RFC 的第 4.3.2 节列出了请求access_token使用资源所有者密码凭证授予流程的要求。这些要求不包括 a client_secret,因为提供者信任客户。如果此流程用于不受信任的客户端,则客户端将不需要 a client_secret,因为客户端只需使用用户username和向提供者进行身份验证即可password此流程基本上复制了传统的基于密码的身份验证方案。

第二个问题确实存在,但是作者并没有真正解释其影响。为了获得对用户的访问权限,access_token攻击者要么需要对用户的计算机进行物理访问,要么利用 Web 中的跨站点脚本等单独的漏洞。Anaccess_token基本上等同于会话 cookie,只是浏览器没有内置机制,如securehttp-onlycookie 标志来保护access_token.

总之,这意味着没有真正的正当理由通过瘦代理发送 API 请求,因为应用程序不应公开 Web 应用程序通常不会公开的任何秘密数据。