检查了
pac4j-5.7.7
和 pac4j-6.0.6
并使用 Keycloak 和 AWS Cognito 作为 OpenId 提供商,在所有 4 种情况下始终可重现。
当我将客户端配置为使用令牌中的
nonce
时,我可以毫无问题地获取第一个令牌。但是,一旦令牌过期并且必须刷新它,我就会收到错误
com.nimbusds.jose.proc.BadJOSEException: Signed JWT rejected: Another algorithm expected, or no matching key(s) found
at PluginClassLoader for oic-auth//com.nimbusds.jwt.proc.DefaultJWTProcessor.process(DefaultJWTProcessor.java:357)
at PluginClassLoader for oic-auth//com.nimbusds.openid.connect.sdk.validators.IDTokenValidator.validate(IDTokenValidator.java:321)
at PluginClassLoader for oic-auth//com.nimbusds.openid.connect.sdk.validators.IDTokenValidator.validate(IDTokenValidator.java:254)
at PluginClassLoader for oic-auth//org.pac4j.oidc.profile.creator.TokenValidator.validate(TokenValidator.java:108)
at PluginClassLoader for oic-auth//org.pac4j.oidc.profile.creator.OidcProfileCreator.create(OidcProfileCreator.java:109)
Caused: org.pac4j.core.exception.TechnicalException
at PluginClassLoader for oic-auth//org.pac4j.oidc.profile.creator.OidcProfileCreator.create(OidcProfileCreator.java:153)
at PluginClassLoader for oic-auth//org.pac4j.core.client.BaseClient.retrieveUserProfile(BaseClient.java:126)
at PluginClassLoader for oic-auth//org.pac4j.core.client.BaseClient.getUserProfile(BaseClient.java:105)
at PluginClassLoader for oic-auth//org.pac4j.oidc.client.OidcClient.renewUserProfile(OidcClient.java:69)
我从OpenId规范的理解刷新令牌不应该有nonce声明,即使在原始身份验证时颁发的ID令牌包含nonce。如果存在,其值必须与原始身份验证时颁发的 ID Token 中的值相同。
如果我使用
OicdConfiguration
设置 setUseNonce(false)
对象,则不会发生错误,就好像验证器始终期望刷新令牌中的随机数声明一样。但是,如果我使用 OicdConfiguration
设置 setUseNonce(true)
对象,我无法刷新令牌,这似乎违反了 OpenId 规范。
nonce
位于 ID 令牌中,而不是刷新令牌中。
由于 ID 令牌验证失败,我猜会在
Successful Refresh Response
上返回 ID 令牌,对吧?
此 ID 令牌是否包含
nonce
?