Подтвердить что ты не робот

Запросить новый токен доступа, используя токен обновления в username-password grant в Spring Безопасность OAuth2

Мы используем грант username-password для получения токена доступа с нашего сервера auth. Мы хотим обновить токен доступа до истечения срока его действия, используя предоставленный токен обновления, пока пользователь не выйдет из системы или не закрывает клиентское приложение.

Однако я просто не могу найти примеры того, как выдать этот запрос токена обновления.

Чтобы получить токен, мы вызываем что-то вроде:

curl -v --data "grant_type=password&username=user&password=pass&client_id=my_client" http://localhost:8080/oauth/token

Итак, чтобы обновиться, я ожидал, что вызов будет выглядеть следующим образом:

curl -v --data "grant_type=refresh_token&access_token=THE_ACCESS_TOKEN&refresh_token=THE_REFRESH_TOKEN" http://localhost:8080/oauth/token

или, возможно,

curl -v -H "Authorization: Bearer THE_ACCESS_TOKEN" --data "grant_type=refresh_token&refresh_token=THE_REFRESH_TOKEN" http://localhost:8080/oauth/token

Но он просто даст мне 401.

О да, может, мне нужно добавить clientId? Я не могу использовать секрет клиента, потому что его нет (см. Выше запрос на получение токена). Аутентификация выполняется с использованием имени пользователя и пароля в конце концов..

Я думаю, что мы правильно настроили сервер, поэтому я не буду публиковать его здесь. Если один из моих примерных запросов должен работать, и вам нужно увидеть важные части конфигурации, я их добавлю.

Спасибо!

4b9b3361

Ответ 1

Итак, как я уже сказал, мы не используем секрет клиента, потому что мы не можем иметь это в приложении Javascript. И это все равно не понадобилось при использовании пароля для имени пользователя. (Посмотрите, как мы запрашиваем токен доступа). Действительно, я был близок к решению и, наконец, понял:

curl -v --data "grant_type=refresh_token&client_id=THE_CLIENT_ID&refresh_token=THE_REFRESH_TOKEN" http://localhost:8080/oauth/token

поэтому нет необходимости в токене доступа или в секретности клиента.

Во всем он чувствует себя достаточно безопасно.

  • Мы не храним никакой секретной информации на стороне клиентского приложения.
  • Пользователям всегда нужен пароль для входа в систему и могут видеть только их ресурсы.
  • Мы ограничиваем действительность токена обновления реалистичным временем, таким как рабочий день или что-то еще, так что, даже если оно скомпрометировано, окно для злоумышленника ограничено, но при этом позволяет пользователю оставаться на связи с сервером ресурсов в течение длительного времени сессия.

Ответ 2

Для пароля grant_type требуются clientId и clientSecret. Вы были близки к своей третьей попытке, но вы передаете кодированные Base64 clientId и clientSecret вместо токена доступа в заголовке авторизации. Это правильный запрос токена обновления:

curl -H "Authorization: Bearer [base64encode(clientId:clientSecret)]" "https://yourdomain.com/oauth/token?grant_type=refresh_token&refresh_token=[yourRefreshToken]"

Для хорошей справки проверьте это: http://techblog.hybris.com/2012/06/11/oauth2-resource-owner-password-flow/