1

人们经常会读到ResourceOwnerCredentials流是坏的,因为不能有一个不可信的客户端(lika是Javascript或移动应用程序)涉及的密钥。使用RSA256(不对称)签名JWT时,甚至需要共享密钥吗?

如果令牌是非对称签名的,并且可以由客户端使用OAuth 2.0服务器提供的公钥JWK(Json Web Key)进行验证,那么这甚至有效吗?

回答

1

你误解了“资源所有者密码凭据格兰特”(link to spec.)

这是什么流程所做的是,替代资源所有者(如果它是一个人,这将是最终用户)的凭证与授权码。作为该规范说明它可以用来替代传统系统,例如使用基本认证,为此需要在客户端和资源所有者之间建立信任关系。找到一篇好文章,您可以在这里阅读更多关于link

另一方面,客户证书授予是一项授权,要求客户获得和维护(link to spec.)。此授予仅适用于机密客户端

客户端凭证授予类型只能由机密 客户端使用。

我相信你对两种不同的授权类型感到困惑。正如您已经看到的,移动应用程序和JavaScript应用程序是公共客户端。所以客户端凭证授予不能用于他们。

此外,一旦确实可以使用公钥验证令牌,但要做到这一点,应该通过完成有效的流程来获取令牌。

对于机密客户端,可以使用共享密钥来加密令牌。但是这不能为公共客户完成,因为他们不能保持共享的秘密。

反正这里是使用客户端认证的用例(如在说明书中所描述:Client authentication

  • 强制刷新令牌码和授权码的结合 它们被发出到客户端。当授权代码通过不安全通道传输到重定向 端点或重定向URI的 未完全注册时,客户端身份验证至关重要 。

  • 通过禁用客户端或 更改凭据从受损客户端恢复,从而防止攻击者滥用 被盗取的刷新令牌。更改一组客户端凭证 凭证要比取消整个集合的刷新令牌要快得多。

  • 实施身份验证管理最佳做法,其中 需要定期凭据轮换。刷新令牌的整个集合 的旋转可能是具有挑战性的,而单个客户端凭证的轮换更容易。

在事实上,机密的客户,您可以通过更改共享的秘密改变客户端身份验证的灵活性。

+1

对不起,但这并不能回答我的问题。我的问题基本上是:为什么共享的秘密(这是公共客户不可能的)一个好主意?它保护哪个威胁? 我并没有将客户端证书与ROPC混淆。我只是想知道客户秘密(适用于某些赠款而不适用于其他客户)会使我获益吗? – Wolfgang

+0

@Wolfgang在OAuth2.0规范中定义它。我已经添加了相关的详细信息并扩展了答案。 –