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

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

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

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

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? Я не могу использовать секрет клиента, потому что его нет (см. выше запрос на получение токена). Аутентификация выполняется с использованием имени пользователя и пароля в конце концов..

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

спасибо!

2 ответов


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

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

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

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

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

для пароля 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/