Вопрос по omniauth, ruby-on-rails, oauth-2.0, google-api – Как обновить токен доступа google_oauth2 с помощью моего токена обновления?

7

У меня есть приложение RoR, в котором я аутентифицируюсь на Google, используя omniauth и google_oauth2, где я запрашиваю автономный доступ.

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

Ваш Ответ

2   ответа
9

Для примера использования гема 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
отлично, у меня работает, спасибо
Код, который я разместил выше, является кодом, который выполняет запрос POST для обновления токена. После того, как вы выполните ваш запрос GET, я бы проверил, равен ли код ответа 401, то есть, как правило, тот код, который вы получите, когда вам нужно обновить свой токен. Если код ответа HTTParty == 401, тогда запустите мой код (с учетом ваших потребностей).
где бы вы реализовали это в своем приложении rails? например, у меня есть запрос на получение для получения контактов пользователей с помощью httparty, который отправляет токен, как я скажу опубликовать токен обновления, если токен истек?
5

Я ничего не вижу в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.

Похожие вопросы