Search code examples
ruby-on-railsomniauthgoogle-dfp

Accessing the Google DFP API with a OmniAuth refresh token


I am working on a rails app where I need to access users Google Double Click for Publisher Data. I am using the 'google-dfp-api' gem. I have set up OmniAuth for users to authenticate their DFP accounts and am storing the refresh token per the google documentation (https://developers.google.com/doubleclick-publishers/docs/authentication). I can not figure out how to use the refresh token to access the DFP api.

I am attempting to make the connection as shown below:

dfp = DfpApi::Api.new({
      :authentication => {
        :method => 'OAuth2',
        :oauth2_client_id => GOOGLE_CLIENT_ID,
        :oauth2_client_secret => GOOGLE_CLIENT_SECRET,
        :user_agent => USER_AGENT,
        :application_name => APP_NAME,
        :oauth2_token => {
          :refresh_token => GOOGLE_DFP_REFRESH_TOKEN
        }
      },
      :service => {
        :environment => 'PRODUCTION'
      }
    })

AnyTime I attempt to make a query after this I get the following error:

DfpApi::V201411::UserService::ApiException: [AuthenticationError.AUTHENTICATION_FAILED @ ]

Solution

  • You do not use the refresh token to access the api, use your access_token. I am refreshing the access_token before I make a call.

    Refresh your token:

     def refresh_access_token
       refresh_token = self.refresh_token
       google_refresh_url = "https://accounts.google.com/o/oauth2/token"
       response = RestClient.post google_refresh_url, :grant_type => 'refresh_token', :refresh_token => refresh_token, :client_id => ENV['GOOGLE_CLIENT_ID'], :client_secret => ENV['GOOGLE_CLIENT_SECRET']
       response_hashed = JSON.parse(response)
       new_access_token = response_hashed['access_token']
       self.save_new_access_token(new_access_token)
     end
    

    Then the OAuth DFP API hash should look as below:

    @api = DfpApi::Api.new({
      :authentication => {
        :method => 'OAuth2',
        :oauth2_client_id => ENV['GOOGLE_CLIENT_ID'],
        :oauth2_client_secret => ENV['GOOGLE_CLIENT_SECRET'],
        :application_name => ENV['GOOGLE_APP_NAME'],
        :client_customer_id => google_dfp_credential.google_client_customer_id,
        :network_code => google_dfp_credential.network_code,
        :user_agent => ENV['GOOGLE_DFP_USER_AGENT'],
        :oauth2_token => {
          :access_token => google_dfp_credential.access_token,
         },
       },
       :service => {
         :environment => 'PRODUCTION'
        }
      })
    

    The user_agent is a unique string to your app, that should be the same every time you access the api. See the link below for more info on that:

    http://googleadsdeveloper.blogspot.com/2013/11/please-set-user-agent-or-application.html

    You will also need to get the network_code from the the dfp account you are accessing by logging into the dfp account manually. To my knowledge this is not returned with OAuth authentication. See step 2 in the link below for more info on how to get the network_code:

    https://developers.google.com/doubleclick-publishers/docs/start