Запросить новый токен доступа, используя токен обновления в 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/