如何使用Google API Ruby客户端进行授权?

时间:2017-01-02 15:55:15

标签: ruby api google-api google-analytics-api

我想通过谷歌的API获取谷歌分析帐户的数据,并在我的某个仪表板上显示一些值。如果可能的话,我想使用Ruby。

google-api-ruby-client似乎是一个很好的起点,我甚至发现了一些帮助很多的useful sample code,但我正在努力正确授权我的请求。

在相同的示例代码中,有一部分shows how to do it,但我不知道从哪里获得必要的密钥。

到目前为止我所做的事情:

  1. https://console.developers.google.com
  2. 上创建了一个项目
  3. 启用了Analytics API
  4. 根据向导,我创建并下载了一个服务帐户密钥,如下所示:

    {
      "type": "service_account",
      "project_id": "xxx"
      "provate_key_id": "xxx",
      "private_key": "xxx",
      "client_email": "xxx",
      "client_id": "xxx",
      "auth_uri": "https://accounts.google.com/o/oauth2/auth",
      "token_uri": "https://accounts.google.com/o/oauth2/token",
      "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
      "client_x509_cert_url": "xxx"
    }
    
  5. 但是,我无法弄清楚如何使用它。也许我犯了一个错误,我需要从谷歌那里取一些其他类型的密钥?

1 个答案:

答案 0 :(得分:1)

由于Google API的性质和企业安全要求,这比一般的RESTful硅谷API要复杂一些。我需要在过去的项目中这样做,我认为这会有所帮助。

首先,为了更轻松地查询我需要的数据,我使用了Legato,它自我描述为“Google Analytics核心报告和管理API的Ruby客户端”。

为了让Legato正常工作,您需要从Google获取OAuth令牌,该令牌会在一段时间后过期。

class AuthToken
  def self.retrieve
    new.retrieve
  end

  def retrieve(expires_in = 1.hour)
    client = Google::APIClient.new(application_name: 'YOUR APP NAME', application_version: '0.1')
    client.authorization = service_account('https://www.googleapis.com/auth/analytics.readonly', private_key).authorize
    OAuth2::AccessToken.new(oauth_client, client.authorization.access_token, expires_in: expires_in )
  end

private

  def oauth_client
    OAuth2::Client.new('', '', {
      authorize_url: authorize_url,
      token_url: token_url
    })
  end

  def service_account(scope, key)
    Google::APIClient::JWTAsserter.new(ENV['GOOGLE_SERVICE_EMAIL'], scope, key)
  end

  def private_key
    @private_key ||= Google::APIClient::PKCS12.load_key(
      ENV['GOOGLE_PRIVATE_KEY_PATH'],
      ENV['GOOGLE_PRIVATE_KEY_PASSPHRASE']
    )
  end

  def authorize_url
    'https://accounts.google.com/o/oauth2/auth'
  end

  def token_url
    'https://accounts.google.com/o/oauth2/token'
  end
end

这假设您有三个与Google为您提供的身份验证数据相对应的环境变量:

  1. GOOGLE_SERVICE_EMAIL,与您在JSON对象中的客户端电子邮件相同。
  2. GOOGLE_PRIVATE_KEY_PATH,指向您应该可以同时下载的.p12文件。
  3. GOOGLE_PRIVATE_KEY_PASSPHRASE,字面上应该是“notasecret”。
  4. 您可以像这样使用legato服务:

    class ArticlePageviews
      extend Legato::Model
      metrics :pageviews
      dimensions :page_path
      filter(:only_articles) { contains :page_path, '/articles/' }
    end
    
    ga_user = Legato::User.new(AuthToken.retrieve)
    ga_profile = ga_user.profiles.first
    
    ArticlePageviews.only_articles.results(ga_profile)
    

    祝你好运!