Rails service + OAuth
The first step would be to refactor out the instanciation of the Oauth2 client:

# lib/analytics_oauth2_client
class AnalyticsOAuth2Client &gt; OAuth2::Client
  def initialize(client_id, client_secret, options = {}, &amp;block)
    client_id || = ENV['GA_CLIENT_ID']
    client_secret || = ENV['GA_SECRET_KEY']
    options.merge!(
        authorize_url: 'https://accounts.google.com/o/oauth2/auth',
          token_url: 'https://accounts.google.com/o/oauth2/token'
    )   
    super(client_id, client_secret, options, &amp;block)
  end 
end


And then maybe we should devise a strategy to save those pesky oauth tokens:

class AccessToken &lt; ActiveRecord::Base
  # @expires_at [Int]
  # @access_token [String]
  # @refresh_token [String]
end

class GoogleAnalyticsController

  # ...
  def oauth_callback
    @client = AnalyticsOAuth2Client.new
    token = @client.auth_code.get_token(params[:code], :redirect_uri =&gt; ENV['GA_OAUTH_REDIRECT_URL'])
    @saved_token = AccessToken.create!(token.to_hash)
    session[:oauth_token] = @saved_token.id
    redirect_to new_report_path
  end
end


And we need a controller method to get the access token from the session:

def authorize!
  # ... @todo redirect to back to authentication if no `session[:oauth_token]`
  stored_token = Token.find!(session[:oauth_token])
  @token = OAuth2::AccessToken(AnalyticsOAuth2Client.new, stored_token.attributes)
  @client = GoogleAnalytics.new(token: @token)
end


And we need to shove the token into GoogleAnalytics:

class GoogleAnalytics
  include ActiveModel::Model

  attr_writer :token
  attr_accessor :user

  def initialize(attrs: {})
    super
    @user ||= Legato::User.new(@token) if @token
  end
end


Then we consider the separation of concerns - models should not deal with authentication - thats a controller concern. You should pass whatever authorized object the models needs
from the controller. Dependency injection is commonly used for this:

class Report
  attr_writer :client

  def get_keywords(oauth_code)
    self.url = @client.fetch_url(self.web_property_id)
    self.keywords = # Get keywords for self.url from another service
    keyword_revenue_data(oauth_code)
  end
end

class ReportsController
  # ...

  def create
    @report = Report.new(client: @client, params[:report])
    @report.get_top_traffic_keywords
    create!
  end

  # ...
end