Java 在spring security中解码AWS Cognito生成的JWT时出错

Java 在spring security中解码AWS Cognito生成的JWT时出错,java,amazon-cognito,spring-security-oauth2,Java,Amazon Cognito,Spring Security Oauth2,在解码AWS Cognito生成的JWT时,我们突然开始发现以下错误。 Spring Security JWT { "error": "access_denied", "error_description": "Invalid token does not contain resource id (oauth2-resource)" } 我们使用的是Spring启动版本:2.0.3.0 这对于AWS Cognito生成的令牌更为特殊,这就是为什么它突然停止工作,而代码库/spr

在解码AWS Cognito生成的JWT时,我们突然开始发现以下错误。 Spring Security JWT

{
    "error": "access_denied",
    "error_description": "Invalid token does not contain resource id (oauth2-resource)"
}
我们使用的是Spring启动版本:2.0.3.0

这对于AWS Cognito生成的令牌更为特殊,这就是为什么它突然停止工作,而代码库/spring库或infra没有任何更改

最新更新: 似乎AWS已经回复了变更,在下面添加了“aud索赔”,解码后的JWT讲述了这个故事

今天2019年10月16日JWT

 {
    "sub": "XXXXXXXXXXXX-6a8dd388a720",
    "token_use": "access",
    "scope": "XXXXXXXXXXXX",
    "auth_time": 1571227222,
    "iss": "YYYYYYYYYYYYYYYY",
    "exp": 1571230822,
    "iat": 1571227222,
    "version": 2,
    "jti": "XXXXXXXXXXXXXYYYYYYYYYYYYY",
    "client_id": "someclient_id",
    "username": "someusername"
     }
昨天我们得到:

  {
  "sub": "xxxxxxxxxxxxx",
  **"aud": "sameasclientid",**
  "token_use": "access",
  "scope": "somescope",
  "auth_time": 1571132619,
  "iss": "rrrrrrrrrrrrrrrrrrrrr",
  "exp": 1571136219,
  "iat": 1571132619,
  "version": 2,
  "jti": "xxxxxxxxxxxxxxxxx",
  "client_id": "sameasclientid",
  "username": "someusername"
 }

我们通过SO链接解决了这个问题

AWS Cognito生成的令牌现在似乎添加了一个新的声明aud。SpringOAuth期望JWT令牌中的aud声明默认为oauth2资源

修复方法是在Spring资源服务器配置中的JWT令牌中添加aud,其值为客户机id

有关cognito令牌中JWT声明的信息,请参见

更新

似乎AWS已经恢复了在JWT令牌中添加“aud”索赔的更改。 我们不再收到JWT的“澳元”索赔

解码我们昨天收到的JWT 2019年10月15日

{
  "sub": "XXXXXXXXXXXXXXXXX",
  "aud": "SAME_AS_CLIENT_ID",
  "token_use": "access",
  "scope": "SOMESCOPE",
  "auth_time": 1571132619,
  "iss": "SOME_ISSUER",
  "exp": 1571136219,
  "iat": 1571132619,
  "version": 2,
  "jti": "8XXXXXXXXXXXXXXXX",
  "client_id": "SAME_AS_CLIENT_ID",
  "username": "SOME_USERNAME"
}
解码JWT我们将于2019年10月16日收到

{
  "sub": "XXXXXXXXXXXXXXXXX",
  "token_use": "access",
  "scope": "SOMESCOPE",
  "auth_time": 1571227222,
  "iss": "SOME_ISSUER",
  "exp": 1571230822,
  "iat": 1571227222,
  "version": 2,
  "jti": "8XXXXXXXXXXXXXXXX",
  "client_id": "SAME_AS_CLIENT_ID",
  "username": "SOME_USERNAME"
}
所以现在,即使我们不按以下方式配置它,它也应该可以工作。或者从配置类中删除以下代码段:

@Override
public void configure(ResourceServerSecurityConfigurer config) throws 
Exception {
    config.resourceId(null).tokenServices(tokenServices());
}

我们通过SO链接解决了这个问题

AWS Cognito生成的令牌现在似乎添加了一个新的声明aud。SpringOAuth期望JWT令牌中的aud声明默认为oauth2资源

修复方法是在Spring资源服务器配置中的JWT令牌中添加aud,其值为客户机id

有关cognito令牌中JWT声明的信息,请参见

更新

似乎AWS已经恢复了在JWT令牌中添加“aud”索赔的更改。 我们不再收到JWT的“澳元”索赔

解码我们昨天收到的JWT 2019年10月15日

{
  "sub": "XXXXXXXXXXXXXXXXX",
  "aud": "SAME_AS_CLIENT_ID",
  "token_use": "access",
  "scope": "SOMESCOPE",
  "auth_time": 1571132619,
  "iss": "SOME_ISSUER",
  "exp": 1571136219,
  "iat": 1571132619,
  "version": 2,
  "jti": "8XXXXXXXXXXXXXXXX",
  "client_id": "SAME_AS_CLIENT_ID",
  "username": "SOME_USERNAME"
}
解码JWT我们将于2019年10月16日收到

{
  "sub": "XXXXXXXXXXXXXXXXX",
  "token_use": "access",
  "scope": "SOMESCOPE",
  "auth_time": 1571227222,
  "iss": "SOME_ISSUER",
  "exp": 1571230822,
  "iat": 1571227222,
  "version": 2,
  "jti": "8XXXXXXXXXXXXXXXX",
  "client_id": "SAME_AS_CLIENT_ID",
  "username": "SOME_USERNAME"
}
所以现在,即使我们不按以下方式配置它,它也应该可以工作。或者从配置类中删除以下代码段:

@Override
public void configure(ResourceServerSecurityConfigurer config) throws 
Exception {
    config.resourceId(null).tokenServices(tokenServices());
}

我面临类似的问题,在我的案例中,我不需要验证JWT索赔中添加的aud参数

这不是来自AWS Cognito的正确实现,也就是说,aud应该包含资源服务器的资源ID,承载令牌将用于这些服务器,但是Cognito只是复制了与clientId相同的值。在我们的例子中,有多个客户端可以调用一个资源服务器,根据Coginto的实现,资源服务器需要知道clientId的列表,这与Oauth2标准是错误的

如需了解更多信息,请访问

JWT必须包含包含以下内容的aud受众声明: 值,该值将授权服务器标识为目标服务器 观众授权服务器的令牌终结点URL 可以用作aud元素的值,以标识 授权服务器作为JWT的目标受众。这个 授权服务器必须拒绝任何不包含 它自己作为目标受众的身份。在没有 应用程序配置文件指定其他兼容应用程序 必须使用简单字符串比较访问群体值 RFC 3986第6.2.1节中定义的比较方法 [RFC3986]。如第5节所述,精确的字符串 用作给定授权服务器的访问群体必须是 由授权服务器和 JWT的发行人

因此,如果不需要验证aud参数,请将资源服务器的resourceId设置为空默认值“oauth2 resource”,如下所示

@Override
public void configure(ResourceServerSecurityConfigurer config) throws Exception {
    config.resourceId(null).tokenServices(tokenServices());
}

如果资源服务器的resourceId为空,Spring security将忽略aud参数。

我遇到了类似的问题,在我的情况下,我不需要验证JWT声明中添加的aud参数

这不是来自AWS Cognito的正确实现,也就是说,aud应该包含资源服务器的资源ID,承载令牌将用于这些服务器,但是Cognito只是复制了与clientId相同的值。在我们的例子中,有多个客户端可以调用一个资源服务器,根据Coginto的实现,资源服务器需要知道clientId的列表,这与Oauth2标准是错误的

如需了解更多信息,请访问

JWT必须包含包含以下内容的aud受众声明: 值,该值将授权服务器标识为目标服务器 观众授权服务器的令牌终结点URL 可以用作aud元素的值,以标识 授权服务器作为JWT的目标受众。这个 授权服务器必须拒绝任何这样做的JWT 不包含 它自己作为目标受众的身份。在没有 应用程序配置文件指定其他兼容应用程序 必须使用简单字符串比较访问群体值 RFC 3986第6.2.1节中定义的比较方法 [RFC3986]。如第5节所述,精确的字符串 用作给定授权服务器的访问群体必须是 由授权服务器和 JWT的发行人

因此,如果不需要验证aud参数,请将资源服务器的resourceId设置为空默认值“oauth2 resource”,如下所示

@Override
public void configure(ResourceServerSecurityConfigurer config) throws Exception {
    config.resourceId(null).tokenServices(tokenServices());
}

如果资源服务器的resourceId为空,Spring security将忽略aud参数。

此可能重复的可能重复项不正确,一个令牌可以包含多个由空格分隔的资源id。请参阅Oauth2标准的文档。aud param与clientId相同的值集是Coginto的错误实现,这就是为什么他们今天可能已经恢复了更改。相反,将resourceId设置为“null”,以便spring安全性通过检查。答案是一个解决办法。因为我们已经向AWS提出了一个问题。而且AWS,Cognito没有完全实现OAuth,似乎他们做了一些定制的解决方案。它是否正确取决于答案的有用性。这是不正确的,一个令牌可以包含多个由空格分隔的资源id。请参阅Oauth2标准的文档。aud param与clientId相同的值集是Coginto的错误实现,这就是为什么他们今天可能已经恢复了更改。相反,将resourceId设置为“null”,以便spring安全性通过检查。答案是一个解决办法。因为我们已经向AWS提出了一个问题。而且AWS,Cognito并没有完全实现OAuth,似乎他们做了一些定制的解决方案。答案是否正确取决于答案的有用性。