我正在实现一个 API 和一个客户端 Web 应用程序,它们应该通过 API 进行通信并使用 OAuth 2 进行身份验证。
我无法克服我对什么是验证用户的正确方法的困惑(即没有重大安全疏忽)。
我收集了以下内容:
- 理想情况下,您应该在 API 服务器上公开一个 Web 表单,该表单接受用户名和密码并使用授权代码重定向回来,以便在客户端交换访问令牌访问令牌。
- 我描述的方法被认为很麻烦,因此 OAuth 2 提供了一个隐式流程,客户端应用程序发出一个包含 a
client_id
和它收集的用户凭据的请求。它接收访问令牌。 - 身份验证工具包似乎对只允许传递 持谨慎态度
client_id
,而是要求client_secret
包含 。 - 基于前一点,作为开发人员,您可能必须将您
client_secret
的应用程序嵌入到可分发的应用程序中,从而使其公开。 - 一些了解 OAuth 2 的同行告诉我,开发人员将 OAuth 嵌入到他们的可分发产品中并不少见
client_secret
,一些知名服务(据称是 Twitter)也这样做。 - 如果您在客户端和 OAuth 2 服务器之间添加代理以添加
client_secret
请求,它不会提高安全性,因为它类似于client_secret
完全忽略。 - 我发现与嵌入
client_id
和client_secret
客户端相关的唯一安全问题是攻击者可能会实现他们自己的客户端,当给定用户凭据时,它可能代表用户行事。这似乎不是一种可能的攻击,因为网络钓鱼是相似的并且会产生更大的好处。
以下问题对我来说仍然没有答案:
- 客户端凭据流程和资源所有者密码流程有什么区别?我应该更喜欢哪一个?这个问题的答案并没有让我清楚地理解差异。
- 使用隐式流是否存在任何重大的安全问题,或者它是否可行?
- 是嵌入
client_secret
保险箱吗?
- 如果没有,有什么替代方案?我应该仍然需要一个
client_id
,还是允许使用“公共”(未注册)客户?