Как обновить токен доступа google_oauth2, используя мой токен обновления?
У меня есть приложение RoR, где я аутентифицируюсь на Google, используя omniauth и google_oauth2, где я запрашиваю автономный доступ.
Как использовать токен обновления для запроса текущего токена доступа? Кроме того, как я могу обновить свой токен доступа, когда он больше не работает? Я не хочу иметь никакого пользовательского интерфейса в этой ситуации, при условии, конечно, что авторизация не была удалена.
2 ответа
Я ничего не вижу в google_oauth2
который обрабатывает выборку нового access_token
с токеном обновления, так что похоже, что вам нужно будет произвести обмен напрямую.
Официальная документация Google OAuth 2.0 объясняет, как сделать это на низком уровне. В вашем серверном коде используйте ваш любимый HTTP-клиент для создания запроса, который выглядит следующим образом:
POST /o/oauth2/token HTTP/1.1
Host: accounts.google.com
Content-Type: application/x-www-form-urlencoded
client_id=CLIENT_ID&
client_secret=CLIENT_SECRET&
refresh_token=REFRESH_TOKEN&
grant_type=refresh_token
где CLIENT_ID
а также CLIENT_SECRET
те же, что вы использовали для оригинальной аутентификации и REFRESH_TOKEN
это токен обновления из исходного потока аутентификации. Если обмен выполнен успешно, вы получите новый токен доступа в ответе, который выглядит примерно так:
{
"access_token":"1/fFBGRNJru1FQd44AzqT3Zg",
"expires_in":3920,
"token_type":"Bearer",
}
Вы можете следовать этому процессу, чтобы получить новый токен доступа, когда он вам понадобится. Вы можете использовать expires_in
значение, чтобы оценить, когда вам потребуется новый, или попытаться обновить каждый раз, когда ваш запрос API отвечает статусом 401 HTTP.
Для примера использования гема Ruby HTTParty:
Где @auth - запись ActiveRecord, в которой хранятся ключи авторизации для конкретного пользователя, для которого вы пытаетесь обновить токены.
# Refresh auth token from google_oauth2 and then requeue the job.
options = {
body: {
client_id: <YOUR GOOGLE API CLIENT ID HERE>,
client_secret: <YOUR GOOGLE API SECRET KEY HERE>,
refresh_token: @auth.refresh_token,
grant_type: 'refresh_token'
},
headers: {
'Content-Type' => 'application/x-www-form-urlencoded'
}
}
@response = HTTParty.post('https://accounts.google.com/o/oauth2/token', options)
if @response.code == 200
@auth.token = @response.parsed_response['access_token']
@auth.expires_in = DateTime.now + @response.parsed_response['expires_in'].seconds
@auth.save
else
Rails.logger.error("Unable to refresh google_oauth2 authentication token.")
Rails.logger.error("Refresh token response body: #{@response.body}")
end