2012-06-02 6 views
4

Мне нужно подключиться к Google Analytics. Я использую omniauth_google_oauth2 для аутентификации пользователя с помощью приложения, и это дает мне токен. Проблема в том, что мне нужно подключиться к учетной записи Google Analytics этого пользователя. Чтобы подключить GA к моему приложению, я использую камень garb, который имеет только два метода аутентификации; имя пользователя/пароль и токен OAuth. Когда я использую токен, предоставляемый omniauth_google_oauth2, он не работает.Как я могу связать одежду с токеном из omniauth_google_oauth2?

Как создать новый токен, используя только oauth_token, который я получаю от аутентификации с помощью omniauth_google_oauth2?

ответ

1

Я думаю, что проблема Вы сталкиваетесь в том, что garb только аутентификации пользователя с использованием OAuth 1 (или имя пользователя/пароль комбо), в то время как omniauth_google_oauth2 (очевидно) OAuth 2.

Единственное решение, которое я» ве нашли это использовать устаревший реализации компании Google OAuth 1 следующим образом ...

Gemfile:

gem 'omniauth-google', :git => 'git://github.com/davidkpham/omniauth-google.git' 
# This fork relaxes dependencies on omniauth itself 

Initializer (для Google Analytics доступа):

provider :google, 'XXXXXXXXXXXX.apps.googleusercontent.com', 'YOUR_SECRET', scope: 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile https://www.google.com/analytics/feeds/' 

На обратный вызов, хранить некоторые вещи передаются обратно:

auth = request.env["omniauth.auth"] 
session[:google_token] = auth.credentials.token 
session[:google_secret] = auth.credentials.secret 

Затем построить для garb маркер доступа:

if session[:google_token] and session[:google_secret] 
    consumer = OAuth::Consumer.new('XXXXXXXXXXXX.apps.googleusercontent.com', 'YOUR_SECRET', { 
    :site => 'https://www.google.com', 
    :request_token_path => '/accounts/OAuthGetRequestToken', 
    :access_token_path => '/accounts/OAuthGetAccessToken', 
    :authorize_path => '/accounts/OAuthAuthorizeToken' 
    }) 
    garbsession = Garb::Session.new 
    garbsession.access_token = OAuth::AccessToken.new(consumer, session[:google_token], session[:google_secret]) 
    # Once we have an OAuth::AccessToken constructed, do fun stuff with it 
    ga_id = "UA-XXXXXXX-X" 
    profile = Garb::Management::Profile.all(garbsession).detect {|p| p.web_property_id == ga_id} 
    ga_monthly = GoogleAnalyticsDate.results(profile, :start_date => (Date.today - 30), :end_date => Date.today, :sort => :date) 
    puts ga_monthly 
end 
+0

Спасибо за отличный ответ, это спасло тонну моего времени. Если у кого-то есть проблемы с конфигурацией, у меня есть пример приложения, которое частично основано на этом ответе: https://github.com/eicca/ga_test –

+0

Это все еще работает? Я использую Signet для получения токена доступа OAuth2 для учетной записи службы (так как мне нужен сервер для сервера), а затем создал новый объект Garb :: Session и назначил ему токен доступа так же, как и ответ. Я получаю сообщение об ошибке для 'Garb :: Management :: Profile.all (garbsession)' –

2

Я знаю, что я опоздал на вечеринку по этому но я решил аналогичную проблему. Вы не можете использовать omniauth_google_oauth2 с нарядом, если не используете вилку одежды, которая поддерживает oauth2. Существует один here, который хорошо поддерживается Сией. Однако для создания сеанса с этой вилкой вам нужно будет использовать объект клиента oauth2. Вы можете настроить профиль своего пользователя с помощью omniauth_google_oauth2 и убедиться, что вы сохранили токен обновления для пользователя, а затем, когда вы хотите захватить данные аналитики с помощью наряда, обновите токен с помощью oauth2, а затем передайте этот объект в свою сессию garb, чтобы вытащить данные пользователя. Вот пример, когда у вас есть refresh_token из omniauth где-то где-то:

client = OAuth2::Client.new YOURGOOGLEAPIKEY, YOURGOOGLEAPISECRET, 
           { 
            :site => 'https://accounts.google.com', 
            :authorize_url => "/o/oauth2/auth", 
            :token_url => "/o/oauth2/token", 
           } 
response = OAuth2::AccessToken.from_hash(client, :refresh_token => omniauth_refresh_token).refresh! 
Garb::Session.access_token = response 
+1

Я бы хотел, чтобы вы немного расширились. Я думаю, что OAuth2 с вилкой Garry Sija - это правильный способ решить эту проблему. Кажется, я не могу это сделать. – adamb0mb

+0

С какими особенностями вы столкнулись? Получает refresh_token из omniauth_google_oauth2, обновляет его, настраивает вилку sija или использует ответ обновления, чтобы начать сеанс garb? – topher

+0

Я понял это ... Я думаю, что у меня просто проблема с работой с «irb». Ваш фрагмент находится на месте. – adamb0mb