ребенок не соответствует потоку OAuth 2.0

Я использую Okta для управления идентификацией. Как клиент в процессе авторизации, я отправляю запрос на авторизацию в Okta. Это работает успешно, и я получаю полезную нагрузку JWT. Я хочу проверить подпись JWT, поэтому я снова обращаюсь к Okta, чтобы получить ключи. Однако идентификаторы ключей (дети) не совпадают, и проверка не выполняется.

Запрос на первоначальную авторизацию:

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 декодируется в:

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

Все идет нормально. Я знаю, что авторизация прошла успешно. Пора проверить JWT.

Однако, когда это сопровождается:

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

Or

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

(они оба возвращают один и тот же ответ), я возвращаю это:

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

Если ребенок не соответствует тому, что я получил в исходном ответе.

В чем моя ошибка?


person Magua    schedule 31.08.2017    source источник
comment
Это хороший вопрос! Я позволил себе немного отредактировать его, чтобы сделать его более читабельным для других людей, которые могут столкнуться с этим. Сообщите мне, если вы считаете, что моя правка слишком сильно изменила смысл вашего вопроса.   -  person Nate Barbettini    schedule 07.09.2017


Ответы (2)


Вам необходимо создать сервер авторизации и использовать его как конечную точку, например:

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

Вы также должны иметь возможность использовать значение по умолчанию:

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

Обратите внимание, что это отличается от маршрута, который вы использовали (который не указывает сервер авторизации):

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

Вы должны указать сервер авторизации в вашем случае (например, в примерах 1 и 2 выше) как для OAuth 2.0, так и для OpenID Connect.

person Matt Raible    schedule 31.08.2017
comment
Спасибо за ответ. Я вижу, что это верно для потока OAuth2, но, согласно документации для потока OpenID, сервер авторизации не указан - Okta - единственный. Проверка на /.well-known/openid-configuration показывает URL-адреса, которые я использую, без сервера авторизации, указанного в пути. - person Magua; 05.09.2017
comment
Какой язык вы используете для проверки JWT? У нас может быть библиотека, которая может вам помочь. - person Matt Raible; 06.09.2017
comment
@Magua Похоже, что документация подразумевает, что вы не можете использовать OIDC с настраиваемым сервером авторизации, но вы можете. И OAuth 2.0, и OpenID Connect работают с настраиваемой AS. Как сказал Мэтт, у вас, возможно, уже есть собственный AS с именем default. - person Nate Barbettini; 07.09.2017
comment
@MattRaible Я использую jose4j (Java). - person Magua; 07.09.2017
comment
Вы можете попробовать использовать Okta JWT Verifier для Java: github.com/okta/okta-jwt -verifier-java - person Matt Raible; 07.09.2017
comment
JWT кажется полностью действующим - я могу декодировать токен id, и все работает нормально. Однако я не могу найти открытый ключ для проверки подписи, если не подходит ребенок. Пропуск проверки подписи для меня не вариант. - person Magua; 07.09.2017
comment
@Magua А что насчет использования https://{{site}}.okta.com/oauth2/default/v1/authorize вместо этого? - person Nate Barbettini; 08.09.2017
comment
ID приложения - это последний сегмент в декодированном uri эмитента JWT. Это позволит вам получать идентификатор динамически без жесткого кодирования в вашем приложении. - person mccainz; 08.02.2021

Проблема заключалась в том, что эта учетная запись была настроена с закрепленными, а не с вращающимися ключами. oauth2 / v1 / keys требует, чтобы идентификатор клиента был передан в качестве параметра, если вы настроены с закрепленными ключами; правильное имя параметра - client_id, а не clientId. Это приводит к ожидаемому результату.

person Magua    schedule 13.09.2017