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_assertionclient_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_idsub 声明),然后从数据库中获取秘密并用秘密检查jwt?

以上是关于OAuth 2.0 服务器如何知道在客户端身份验证期间应该使用哪个密钥来解析 jwt 令牌? (client_secret_jwt)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Azure 逻辑应用中使用 OAuth 2.0 身份验证?

OAuth 2.0 两腿身份验证与 SSL/TLS

如何在 C# 中获取 OAuth 2.0 身份验证令牌

如何在 JMeter 中进行 OAuth 2.0 身份验证?

如何使用 OAuth 2.0 通过 Azure Active Directory 对用户进行身份验证?

如何进行应用程序到应用程序(服务器到服务器)身份验证、OAuth 2.0、Web API 2.0