I'm having trouble structuring the logic of OAuth integration into my web app. In the app, a user creates a Report
that consists of data from their Google Analytics account.
User steps:
- User clicks 'New Report'
- Google presents the 'Allow Access' page for OAuth access
- User is presented with a list of their GA web properties and selects one
- A report is created using data from the selected web property
My issue is in structuring the code below.
When the user clicks "New Report", they are actually redirected to google_analytics#ga_session
to begin the authorization process. The code to retrieve the user's web properties succeeds, but the code at the bottom needs to be refactored so it is reusable when retrieving web property data. The main two issues I can't figure out is how to make the Google Analytics instance reusable and how to structure the OAuth redirects.
Retrieve web properties:
GoogleAnalyticsController
def ga_session
client = OAuth2::Client.new(ENV['GA_CLIENT_ID'], ENV['GA_SECRET_KEY'], {
:authorize_url => 'https://accounts.google.com/o/oauth2/auth',
:token_url => 'https://accounts.google.com/o/oauth2/token'
})
redirect_to client.auth_code.authorize_url({
:scope => 'https://www.googleapis.com/auth/analytics.readonly',
:redirect_uri => ENV['GA_OAUTH_REDIRECT_URL'],
:access_type => 'offline'
})
end
def oauth_callback
session[:oauth_code] = params[:code]
redirect_to new_report_path
end
ReportsController
def new
@report = Report.new
ga_obj = GoogleAnalytics.new
ga_obj.initialize_ga_session(session[:oauth_code])
@ga_web_properties = ga_obj.fetch_web_properties
end
GoogleAnalytics model
def initialize_ga_session(oauth_code)
client = OAuth2::Client.new(ENV['GA_CLIENT_ID'], ENV['GA_SECRET_KEY'], {
:authorize_url => 'https://accounts.google.com/o/oauth2/auth',
:token_url => 'https://accounts.google.com/o/oauth2/token'
})
access_token_obj = client.auth_code.get_token(oauth_code, :redirect_uri => ENV['GA_OAUTH_REDIRECT_URL'])
self.user = Legato::User.new(access_token_obj)
end
def fetch_web_properties
self.user.web_properties
end
Retrieve web property data: when creating the report
ReportsController
def create
@report = Report.new(params[:report])
@report.get_top_traffic_keywords(session[:oauth_code])
create!
end
Report Model
def get_keywords(oauth_code)
ga = GoogleAnalytics.new
ga.initialize_ga_session(oauth_code) # this is a problem b/c the user will be redirected the new_report_path after the callack
self.url = ga.fetch_url(self.web_property_id)
self.keywords = # Get keywords for self.url from another service
keyword_revenue_data(oauth_code)
end
def keyword_revenue_data(oauth_code)
ga = GoogleAnalytics.new
ga.initialize_ga_session(oauth_code)
revenue_data = # Get revenue data
end