双边 private_key_jwt 断言是否必要?

问题描述 投票:0回答:1

双向应用

private_key_jwt
身份验证方法有什么附加价值?

目前我正在处理从here记录的 API 进行消费。身份验证通过应用

private_key_jwt
client_assertion
来建立客户端身份来进行。

但是,规范还指出服务器端在响应正文中以 json 形式返回自己的签名令牌。我不明白返回编码的

private_key_jwt
的附加价值。有好处吗?安全?

我直觉地期望响应是一个简单的 json 响应。不是 json Web 令牌中编码的有效负载。

免责声明;我不是安全专家,所以我这边的逻辑错误是预料之中的。

rest security jwt
1个回答
0
投票

客户秘密

开始使用 OAuth 时,您使用客户端密钥。这是一个在客户端和授权服务器中配置相同的字符串:

curl --request POST "https://login.example.com/oauth/token"
  -H "content-type: application/x-www-form-urlencoded" \
  -d grant_type=client_credentials \
  -d client_id=my_client \
  -d client_secret=my_client_secret \
  -d scope=orders

优点是易于管理,但有以下缺点:

  • 默认情况下,秘密永远存在
  • 可以使用易于记住但也更容易被攻击者猜测的弱客户端密钥
  • 大规模更新客户端机密可能会很尴尬,因为这样做需要协调部署
  • 秘密在使用它的每条消息中都会被揭示,例如,如果捕获了网络跟踪
  • 窃取客户机密的人可能能够使用它来长期窃取代币

客户主张

private_key_jwt 或

client assertion
是更强大的客户端凭证。发送令牌请求时只有几个字段发生变化,并且返回与使用客户端密钥时相同的令牌响应:

curl --request POST "https://login.example.com/oauth/token"
  -H "content-type: application/x-www-form-urlencoded" \
  -d grant_type=client_credentials \
  -d client_assertion=my_assertion \
  -d client_assertion_type='urn:ietf:params:oauth:client-assertion-type:jwt-bearer' \
  -d scope=orders

它具有这些优点,但客户现在必须管理并偶尔更新私钥:

  • 凭证有时间限制,例如,给定的生命周期可能为 5 分钟
  • 客户端断言只能由拥有私钥的人创建
  • 断言 JWT 具有数字签名,因此证明了私钥的所有权,但没有泄露它
  • 从网络跟踪中窃取客户端断言的人只能使用它来窃取断言生命周期内的令牌
© www.soinside.com 2019 - 2024. All rights reserved.