4

Я использую Rails + Garb Gem (Sija Branch) + omniauth-google-oauth2 Gem, и я могу успешно пройти аутентификацию с помощью API Google Analytics и извлекать данные, которые генерирует наше приложение при использовании Логин пользователя, например:Невозможно получить токен доступа OAuth2 для API Google Analytics

Garb::Session.login('USERNAME', '<PASSWORD>') 

можно затем использовать Наряд для подключения к Analytics Профиль Я хочу и вытащить из него данные и отображает некоторые диаграммы на веб-странице. Все это прекрасно работает.

Однако, я хочу использовать oAuth2 для аутентификации с помощью Google Analytics, поэтому мне пришлось установить ветку Sija Garb Gem из Github (она поддерживает oAuth2), и я также установил gem omniauth-google-oauth2. В настоящее время в теории я должен быть в состоянии проверить подлинность, используя следующий код:

Garb::Session.access_token = access_token # an instance of OAuth2::Client 

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

1) Я создал проект в консоли Google API и включен Analytics API под услуги

2) Это дало мне ID клиента и секрет клиента

3) Я наткнулся на этот код, который я мог заселить с ID и Secret выше:

client = OAuth2::Client.new(
GOOGLE_CLIENT_ID, 
GOOGLE_CLIENT_SECRET, 
{ 
    :site   => 'https://accounts.google.com', 
    :authorize_url => '/o/oauth2/auth', 
    :token_url  => '/o/oauth2/token' 
}) 

4) Тогда есть следующий фрагмент кода:

response = OAuth2::AccessToken.new(
    client, 
    STORED_TOKEN, { 
    refresh_token: STORED_REFRESH_TOKEN, 
    expires_at: STORED_EXPIRES_AT 
}) 

5), а затем в теории связывают с:

Garb::Session.access_token = response 

Проблема у меня есть, у меня нет токена информации в Направьте (4) выше. Мне кажется, что с oAuth2 мне нужно выполнить «рукопожатие» один раз и распечатать значения токена возврата? Возможно, через Rails-код, который печатает возвращаемые значения и затем вставляет значения токена в константу в приложении Rails, чтобы я мог использовать их в приведенном выше коде? Я действительно смущен. Как я упоминал ранее, веб-приложение прекрасно работает с использованием аутентификации пользователя. Все веб-приложение выполняет аутентификацию с помощью аналитики, вытягивая некоторые данные и рисуя диаграмму. Но я застрял преобразовать его в oAuth2 как Я просто не знаю, как получить токен доступа, который ищет Garb Gem. Следует также отметить, что это не общедоступный веб-сайт с аутентификацией нескольких пользователей, это веб-сайт CMS, который подключается к нашим собственным данным Analytics.

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

Большое спасибо заранее,

JR

ответ

5

Я продержалась через это в течение последних нескольких недель, так что позвольте мне поделиться тем, что работал:

Для использования oauth2 вам нужно получить " обновить токен ", который вы используете для повторной аутентификации с помощью google при каждом вызове API.Шаги для этого являются следующими:

1) Настройки учетной записи в консоли API - https://code.google.com/apis/console/b/0/ (кажется, что вы сделали это хорошо) 2) В вашем аккаунте API, убедитесь, что у вас есть редирект URI, указывающий назад к приложению:

http://some-url.com/auth/google_oauth2/callback 
http://localhost:3000/auth/google_oauth2/callback 

Отметим здесь, что Google не будет препятствовать вам перезвонить на локальную машину, как 0.0.0.0:3000 ... так что вам нужно использовать LOCALHOST явно

3) В файле маршрута привяжите этот URL перенаправления к действию в контроллере, где вы собираетесь создать проект или аутентификацию

match '/auth/:provider/callback' => 'authentications#create' 

Символ «: поставщик» просто позволяет соответствовать по нескольким типам OAuth, но вы можете просто поставить «google_oauth2» там, как хорошо.

4) Теперь создаст это действие в контроллере

def create 
    auth = request.env["omniauth.auth"] 
    params = request.env["omniauth.params"] 
    project = Project.find(params['project_id']) 

    Authentication.create(:project_id => project.id, :provider => auth['provider'], :uid => auth['uid'], :access_token => auth['credentials']['refresh_token']) 
    flash[:notice] = "Authentication successful." 
    redirect_to owner_view_project_path(project) 
end 

5) Действие контроллера должны получить соответствующие поля из объекта ответа (детали объекта ответа здесь: https://github.com/zquestz/omniauth-google-oauth2) - в частности, вам нужно получить «refresh_token» и сохранить его в проекте или объекте аутентификации - если вы не добавили атрибут «access_token» к нужному объекту, перейдите теперь с переносом, затем начните сохранять токен обновления в этот атрибут

6) Теперь, когда вы готовы называть эту конкретную аутентификацию и получать данные API для этого, вы можете загрузить этот объект, где вы сохранили маркер доступа, и использовать, чтобы получить новую сессию с API Google следующим образом:

@authentication = Authentications.find(params[:id]) 

    client = OAuth2::Client.new GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, 
            { 
            :site => 'https://accounts.google.com', 
            :authorize_url => "/o/oauth2/auth", 
            :token_url => "/o/oauth2/token", 
            } 
    response = OAuth2::AccessToken.from_hash(client, :refresh_token => @authentication.access_token).refresh! 
    Garb::Session.access_token = response 
    @profiles = Garb::Management::Profile.all 

Этот код сделал было создать маркер доступа OAuth2 (ответ), указав клиента, а затем refresh_token, а затем вызвав 'refresh!' чтобы получить обновленный токен доступа ... затем используйте этот токен доступа, чтобы установить сеанс Garb, затем вызовите все профили для данной учетной записи, используя Gard :: Management :: Profile.all

Надеюсь, это поможет - пусть я знаю, если у вас есть вопросы!

+0

Большое спасибо за ваш подробный ответ. Я действительно получил это, чтобы работать с использованием тех же Rails, но используя cURL, чтобы захватить токен доступа/обновления. Мне не разрешили отвечать на мой вопрос до тех пор, пока я так не поставил его в ответ ниже и не пометил ваше мнение как правильно. Приветствую снова! –

+0

Я сделал то же самое, и я получаю эту ошибку *** OAuth2 :: Ошибка Исключения: GDatainsufficientPermissions Недостаточное разрешение RailsEnthusiast

3

Просто записка о том, что работал для меня:

Процедуру 3, 5 Я использовал Curl вместо того, чтобы извлечь Access/Refresh маркер. Шаг 6 тогда то же самое для меня (используя ветку Sija Garb Gem). Таким образом, используя Curl:

Использование деталей, связанных с Google App ПОСТ следующее с помощью Curl:

curl --data "code=<APP_CODE>&redirect_uri=http://localhost:3000/oauth2callback&client_id=<CLIENT_ID>.apps.googleusercontent.com&scope=&client_secret=<CLIENT_SECRET>&grant_type=authorization_code" https://accounts.google.com/o/oauth2/token 

Отклик принимает вид:

{ 
    "access_token" : "<ACCESS_TOKEN>", 
    "token_type" : "Bearer", 
    "expires_in" : 3600, 
    "refresh_token" : "<REFRESH_TOKEN>" 
} 

который можно подключить в Гарб Gem согласно части 6.

1

Ответ на вопрос @CamNorgate действителен.

Если у вас нет "refresh_token" назад от OmniAuth на обратный вызов убедитесь, что вы правильно инициализацией: google_oauth2

Rails.application.config.middleware.use OmniAuth::Builder do 
    provider :google_oauth2, ENV["GOOGLE_CLIENT_ID"], ENV["GOOGLE_CLIENT_SECRET"], 
    { :scope=>"https://www.google.com/m8/feeds, https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.com/auth/userinfo.profile", 
     :approval_prompt=>"force", access_type="offline" 
    } 

end 

Обязательно включите : approval_prompt => "сила", access_type = «offline», чтобы refresh_token был отправлен обратно. The refresh_token is only provided on the first authorization from the user.