Запросить новый токен доступа, используя токен обновления в 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? Я не могу использовать секрет клиента, потому что его нет (см. Выше запрос на получение токена). Аутентификация выполняется с использованием имени пользователя и пароля в конце концов..
Я думаю, что мы правильно настроили сервер, поэтому я не буду публиковать его здесь. Если один из моих примерных запросов должен работать, и вам нужно увидеть важные части конфигурации, я их добавлю.
Спасибо!
Ответы
Ответ 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/