OAuth 2.0 服务器如何知道在客户端身份验证期间应该使用哪个密钥来解析 jwt 令牌? (client_secret_jwt)
Posted
技术标签:
【中文标题】OAuth 2.0 服务器如何知道在客户端身份验证期间应该使用哪个密钥来解析 jwt 令牌? (client_secret_jwt)【英文标题】:How does OAuth 2.0 Server know which secret should use to parse jwt token during client authentication? (client_secret_jwt) 【发布时间】:2021-11-10 15:52:05 【问题描述】:我的任务是在我的身份提供者 (a.k.a client_secret_jwt) (https://datatracker.ietf.org/doc/html/rfc7523#section-2.2) 中使用 JWT 添加对客户端身份验证的支持。
我偶然发现了 jwt 解析。
我看到这样的客户端身份验证流程 (client_secret_jwt):
客户端在IDP中通过注册并获取client_id和client_secret。然后它尝试对其用户进行身份验证,并向“oauth2/token”端点发送一个请求,其中的有效负载包含两个键值对:client_assertion_type(它是一个常量)和client_assertion。 client_assertion 是一个 jwt 令牌,其中包含有关客户端的信息。客户端使用 client_secret 生成 jwt 令牌。
所以客户端发送请求,idp 服务器必须处理那个请求,它从请求中检索 jwt 令牌,现在它必须使用秘密进行解析,但它应该使用哪个 client_secret?此时它对客户端一无所知(因为请求不包含 client_id),所以它无法访问其数据库并获取此客户端的特定密钥?
您能否提供一些关于下一个问题的信息:
-
规范确实不包含有关该问题的信息,是吗?
这是否意味着如果 Oauth 规范没有说明,我应该自己解决这个问题?
如果我必须自己解决此问题,您如何看待遍历所有客户端 idp 机密以寻找合适机密的解决方案?
提前谢谢你。
【问题讨论】:
【参考方案1】:您的问题的答案在您提到的规范的 https://datatracker.ietf.org/doc/html/rfc7523#section-3 中:当客户端使用 JWT 进行客户端身份验证时,它必须在 JWT 断言的 sub
声明中提供其 client_id
。
B.对于客户端身份验证,主题必须是 OAuth 客户端的“client_id”。
【讨论】:
是的。但是要获得 sub 我需要在没有秘密的情况下解析 jwt,因此客户端可以使用任何字符串作为秘密,因为我在不使用秘密的情况下解析 jwt。 也许我应该先解析没有秘密的jwt,但解析后我可以找到client_id
(sub
声明),然后从数据库中获取秘密并用秘密检查jwt?以上是关于OAuth 2.0 服务器如何知道在客户端身份验证期间应该使用哪个密钥来解析 jwt 令牌? (client_secret_jwt)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Azure 逻辑应用中使用 OAuth 2.0 身份验证?
如何在 JMeter 中进行 OAuth 2.0 身份验证?