OAuth:资源请求中是否需要客户机密码?

问题描述 投票:-1回答:4

据我了解:客户端密钥在OAuth1中很重要,但在OAuth2中不再那么重要。

但似乎像谷歌和Twitter这样的公司需要客户机密才能获得访问令牌。

从授权服务器的角度来看(例如Google,Twitter,Github ......):在这些情况中的哪一个是建议的客户端秘密/(必需)?

  • 从授权代码中获取访问令牌。
  • 使用refresh-token获取新的访问令牌。
  • 通过访问令牌获取资源。

是否足以要求它仅通过授权代码获取访问令牌,还是应该在有人使用访问令牌获取资源时提交?


TLDR:在我的情况下:请求“通过授权代码获取访问令牌”和请求“通过刷新令牌获取新访问令牌和刷新令牌”需要客户机密钥。当客户端尝试通过访问令牌获取资源时,我是否还应该询问客户端密钥(需要它)?

oauth oauth-2.0 access-token refresh-token
4个回答
2
投票

首先,你问题的所有答案都隐藏在RFC-6749 The OAuth 2.0 Authorization Framework中。

你的问题:

这些情况中的哪一种是客户秘密推荐/(必需)?从授权代码中获取访问令牌。

请参考section 4.1.3。它告诉我们,如果客户是公开的,而不是机密的,则不需要客户机密。同样在section 2.1. Client Types中,机密客户端类型被描述为:

客户端能够维护其凭证的机密性(例如,在对客户端凭证具有受限访问权限的安全服务器上实现的客户端),或者能够使用其他手段进行安全客户端认证。

不久,Google,Twitter或其他大公司的所有客户都是保密的。因此,在获取访问令牌时必须使用客户端ID和客户端密钥。

第二个问题:

使用刷新令牌获取新的访问令牌。

第一个问题的答案相同。如果客户端是机密的,则需要客户端密码。

第三个问题:

通过访问令牌获取资源。

不需要客户端密钥,因为资源服务器使用访问令牌。但是,授权服务器使用客户机密钥来验证客户机。如果客户端具有访问令牌,则表示它已经过身份验证。请参考section 7. Accessing Protected Resources

总而言之,如果您拥有访问令牌,那么您无需要求客户端密钥来访问资源。但是,如果您是机密客户端,则必须将客户端ID和客户端密钥传递给授权服务器(Google,Twitter等)以获取访问令牌。


0
投票

不,当客户端尝试通过访问令牌获取资源时,您不应该询问客户端密钥。访问令牌应该足够了,但您需要验证它。


0
投票

OAuth2使用客户端机密机制作为授权客户端的手段,以及请求访问令牌的软件。您可能会将其视为一个秘密密码,它向验证服务器证明客户端应用程序有权代表用户发出请求。 (server sided)

所以客户端秘密在某种程度上是客户密码。为了使服务器能够使用客户端,它还必须发送其附带的密码以证明它可以访问该客户端。例如:请求访问令牌的服务器端应用程序必须知道客户端密钥才能获得令牌。这可以防止未经授权使用令牌的恶意应用获取有效的访问令牌。

由于客户机密的敏感性,客户机密不会用于其他类型的流。例如,你不会使用它们在JavaScript或桌面应用程序中使用,它们都可以被反编译,检查,查看源代码,调试等。服务器在大多数情况下应该是安全的,因此客户端的秘密不如它是在桌面应用程序等

授权代码流服务器端。

  • 从授权代码中获取访问令牌。
  • 使用refresh-token获取新的访问令牌。

我想要的方式是,如果您使用Web浏览器登录用户,这是客户端应用程序,我们可以相信登录是用户执行此操作。

如果它是服务器端语言并且通信是在应用程序服务器而不是用户计算机上进行的,那么它的服务器端将需要发送客户端密钥以验证该服务器实际上是可以访问此服务器的正确服务器客户端和电话没有被劫持。

仍然需要客户端密钥并与Oauth2一起使用它只取决于您使用的授权类型以及服务器端或客户端应用程序。

来自评论

我不明白为什么不需要客户端密钥来通过访问令牌获取资源

这实际上是一个单独的问题和一个好问题,但我会在这里解决它。

一旦应用程序具有访问令牌,它就不会再次验证。 (除了确保其来自正确的权威)。资源假设如果访问令牌仍然有效,那么我仍然可以使用它,因此不需要再次验证它们。这就是访问令牌短暂存在的原因,通常只有一个小时有效。行业标准接受如果您的访问令牌被盗,黑客可以在非常有限的时间内访问它,因此可以造成很小的损害。


0
投票

您询问当客户端尝试通过访问令牌获取资源时是否应该询问客户端密钥。

Answer

您的问题的答案是否定的,因为访问令牌本身代表授权结果,旨在通过应用程序,授权服务器和资源服务器,而客户端机密应该是只有应用程序和授权服务器知道的秘密。

我也可以告诉你,客户端密码相当于拥有用户名和密码,因此你不应该将它暴露给资源服务器。

使用客户机密密码验证请求以交换访问令牌的临时授权代码可降低攻击者拦截授权代码并自行使用它的风险。

访问令牌本身是一个短期令牌,这样所有可以使用将过期的令牌进行可嗅探的HTTP访问。 Google在其OAuth 2 API上使用了5分钟。

此外,在授权代码授权流程中,访问令牌永远不会被用户看到,从而降低了令牌泄露给其他人的风险!

~

In depth

让我们看看oauth 2 draft

3.2.1。客户认证

在向令牌端点发出请求时,机密客户端或其他客户端发出的客户端凭据必须使用授权服务器进行身份验证,如第2.3节所述。客户端身份验证用于:

  • 强制将刷新令牌和授权码绑定到发给它们的客户端。当授权代码通过不安全的通道传输到重定向端点时,或者重定向URI尚未完整注册时,客户端身份验证至关重要。
  • 通过禁用客户端或更改其凭据从受感染的客户端恢复,从而防止攻击者滥用被盗的刷新令牌。更改一组客户端凭据比撤消整组刷新令牌要快得多。
  • 实施身份验证管理最佳实践,这需要定期进行凭据轮换。旋转整组刷新令牌可能具有挑战性,而单组客户端凭证的旋转则更加容易。

客户端可以在向令牌端点发送请求时使用“client_id”请求参数来标识自身。

在对token令牌端口的“authorization_code”“grant_type”请求中,未经身份验证的客户端必须发送其“client_id”以防止自己无意中接受用于具有不同“client_id”的客户端的代码。

这可以保护客户端不会替换身份验证代码。 (它不为受保护资源提供额外的安全性。)

第2.3节补充了上一节:

2.3。客户认证

如果客户端类型是机密的,则客户端和授权服务器建立适合授权服务器的安全性要求的客户端认证方法。授权服务器可以接受满足其安全要求的任何形式的客户端身份验证。

机密客户端通常被发布(或建立)用于与授权服务器进行认证的一组客户机凭证(例如,密码,公钥/私钥对)。

授权服务器可以与公共客户端建立客户端身份验证方法。但是,授权服务器不得依赖公共客户端身份验证来识别客户端。

客户端不得在每个请求中使用多个身份验证方法。

最后是关于访问令牌的1.4节:

1.4。访问令牌

访问令牌是用于访问受保护资源的凭据。访问令牌是表示发给客户端的授权的字符串。该字符串通常对客户端不透明。令牌表示由资源所有者授予并由资源服务器和授权服务器强制执行的特定访问范围和持续时间。

令牌可以表示用于检索授权信息的标识符,或者以可验证的方式自包含授权信息(即,由一些数据和签名组成的令牌串)。可能需要额外的身份验证凭据(超出本规范的范围),以便客户端使用令牌。

访问令牌提供抽象层,用资源服务器理解的单个令牌替换不同的授权构造(例如用户名和密码)。这种抽象使得发布访问令牌比用于获取它们的授权授权更具限制性,并且消除了资源服务器理解各种身份验证方法的需要。

访问令牌可以具有基于资源服务器安全性要求的不同格式,结构和使用方法(例如,加密属性)。访问令牌属性和用于访问受保护资源的方法超出了本规范的范围,并由协同规范定义。

© www.soinside.com 2019 - 2024. All rights reserved.