孩子在 OAuth 2.0 流程上不匹配

kid not matching on OAuth 2.0 flow

我正在使用 Okta 进行身份管理。作为授权流程中的客户端,我向 Okta 发送授权请求。这工作成功,我得到了一个 JWT 负载。我想验证 JWT 签名,所以我再次调用 Okta 以获取密钥。但是,密钥 ID(孩子)不匹配,验证失败。

初始授权请求:

https://{{site}}.okta.com/oauth2/v1/authorize
  ?scope=openid
  &response_type=id_token
  &client_id={{client_id}}
  &redirect_uri={{redirect_url}}
  &nonce=4euiv0v52at3la15e7qlu1mt43
  &state=7c92bqulrmdk2jk0ro9rd3mf5j

响应是 403,将我重定向到:

{{redirect_url}}/id_token={{id_token}}

id_token的header被解码为:

{
  "alg": "RS256",
  "kid": "2YKtkekCjCRWN0YqGsjUrNwIQaxGg5ahfHW0_fK8t64"
}

到目前为止一切顺利。我知道授权成功了。是时候验证 JWT 了。

然而,当这跟进时:

https://{{site}}.okta.com/oauth2/v1/keys

或者

https://{{site}}.okta.com/oauth2/v1/keys?clientId={{client_id}}

(他们都 return 相同的回复),我得到了这个:

{
  "keys": [
    {
      "alg": "RS256",
      "e": "AQAB",
      "n": "gv1rI9A7mrOoViJZTzUfiZl7YdEzLEofvRoVbXCgeW7aOmoKcAkWGHvqNRGoFgi8auV5b_TSgTXKq_TV1fz643hpAtba3V0Uw2lXchTbqXpmVRYXI1t4FIwRMXLe4Q-kcvp9la21e3D1lszjdPbFNX5GLAhrCW0Thu2HYbTLg6TbDTMaiQCMo15hek0JgZqRGzCkt9kINnwPVLXV_bkSh_fHWo_6G1L0MKYYQcgE6zvPlULLek98-yZ6Nlg6nJUY9nHn0qjhzqqq-bz_Vin8qi3Bt7SjUKwk7HbaugM84AEgDxYE5JgsaALIl5SgIc3GgFEc69qKWymoD-w1a8f1HQ",
      "kid": "SOxFkBSLWefjlZoDI49Hk0nqlYtC28cjhTlVAYEzAxs",
      "kty": "RSA",
      "use": "sig"
    }
  ]
}

孩子与我在原始回复中收到的内容不符。

我的错误在哪里?

您需要创建一个授权服务器并将其用作端点,例如:

https://{{site}}.okta.com/oauth2/{authorizationServerId}/v1/authorize

您应该也可以使用默认的:

https://{{site}}.okta.com/oauth2/default/v1/authorize

请注意,这与您使用的路由(未指定授权服务器)不同:

https://{{site}}.okta.com/oauth2/v1/authorize

您应该为 OAuth 2.0 和 OpenID Connect 指定一个授权服务器(如上面的示例 1 和 2)。

问题在于此帐户是使用固定密钥设置的,而不是旋转密钥。 oauth2/v1/keys 如果您使用固定键设置,则需要将客户端 ID 作为参数传入;正确的参数名称是 "client_id",而不是 "clientId." 这会产生预期的输出。