Получение ошибки при декодировании JWT, сгенерированной AWS Cognito в весенней безопасности - PullRequest
2 голосов
/ 15 октября 2019

Мы неожиданно начали опускаться ниже error, а decoding JWT генерируется AWS Cognito. Spring Security JWT

{
    "error": "access_denied",
    "error_description": "Invalid token does not contain resource id (oauth2-resource)"
}

Мы используем загрузочную версию Spring: 2.0.3.RELEASE

Это более характерно для токенов, сгенерированных AWS Cognito. И почему он внезапно перестал работать сбез изменений в базовом коде / в весенних или нижних версиях


Последнее обновление: кажется, что AWS отменил изменение (добавление 'требования Aud) ниже декодированного JWT рассказывает историю

Сегодня (16)Октябрь 2019) 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"
 }

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Я столкнулся с подобной проблемой, в моем случае мне не нужно проверять параметр "aud", который добавляется в утверждение JWT.

Это была неправильная реализация из AWS Cognito, то есть «aud» должен содержать идентификаторы ресурсов серверов ресурсов, для которых будет использоваться несущий токен, но Cognito просто копировал то же значение, что и «ID клиента". В нашем случае есть несколько клиентов, которые могут вызывать один сервер ресурсов, в соответствии с тем, что сервер ресурсов реализации Coginto должен знать список clientId, что неверно по стандартам Oauth2.

Чтобы узнать больше об этом, посетите, https://tools.ietf.org/html/rfc7523, там написано

JWT ДОЛЖЕН содержать утверждение aud (аудитории), содержащее значение, идентифицирующее авторизациюСервер как целевая аудитория. URL-адрес конечной точки маркера сервера авторизации МОЖЕТ использоваться в качестве значения для элемента «aud», чтобы идентифицировать сервер авторизации как предполагаемую аудиторию JWT. Сервер авторизации ДОЛЖЕН отклонить любой JWT, который не содержит своего идентификатора в качестве целевой аудитории. В отсутствие профиля приложения, в котором указано иное, совместимые приложения ДОЛЖНЫ сравнивать значения аудитории, используя метод простого сравнения строк, определенный в разделе 6.2.1 RFC 3986 [RFC3986]. Как отмечено в Разделе 5, точные строки, которые будут использоваться в качестве аудитории для данного сервера авторизации, должны быть настроены вне полосы частот сервером авторизации и эмитентом JWT.

Так что если вы нене нужно проверять параметр «aud», установите для resourceId сервера ресурсов значение null (значение по умолчанию «oauth2-resource»), как показано ниже.

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

Spring security игнорирует параметр «aud», еслиидентификатор ресурса сервера ресурсов равен нулю.

0 голосов
/ 15 октября 2019

Мы решили эту проблему, используя ссылку SO здесь .

Похоже, что токен, сгенерированный AWS Cognito, теперь добавляет новое требование aud к токену. Spring OAuth ожидает, что утверждение aud в токене JWT будет oauth2-resource по умолчанию.

Исправлено добавление aud в токен JWT в конфигурации Spring Resource Server со значением client_id. ,

  @Value("${security.oauth2.resource.id:}")
  private String jwtAudResourceId;

  @Override
  public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
    resources.resourceId(jwtAudResourceId);
  }

Информацию о заявках JWT в Cognito Token можно найти здесь .


Обновления


Похоже, AWS отменил изменение, добавив претензию aud в токен JWT. Мы больше не получаем претензию 'aud' в JWT

Декодированный JWT, который мы получали вчера (15 октября 2019 года)

{
  "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, который мы получаем сегодня (16 октября 2019 * 1028)*

{
  "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());
}
...