简体   繁体   English

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

[英]How to authorize with the Google API Ruby client?

I want to fetch data from my google analytics account via google's API, and to display some values on one of my dashboards. 我想通过Google API从我的Google Analytics(分析)帐户中获取数据,并在我的一个仪表板上显示一些值。 I want to use Ruby for this, if possible. 如果可能,我想为此使用Ruby。

The google-api-ruby-client seems like a good place to start, and I have even found some useful sample code that helps out a lot, but I am faling to properly authorize my requests. google-api-ruby-client似乎是一个不错的起点,我什至找到了一些有用的示例代码 ,这些代码对您有很大帮助,但是我无法正确授权我的请求。

In the same sample code, there is a part that shows how to do it but I am not sure where to get the necessary keys. 在相同的示例代码中,有一部分显示了如何执行此操作,但是我不确定从哪里获取必要的密钥。

Things that I've done so far: 到目前为止,我已经做过的事情:

  1. Created a project on https://console.developers.google.com https://console.developers.google.com上创建了一个项目
  2. Enabled the Analytics API 启用Analytics API
  3. Based on a wizard, I have created and downloaded a service account key that looks like: 基于向导,我创建并下载了一个服务帐户密钥,如下所示:

     { "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" } 

But, I can't figure out how to use it. 但是,我不知道如何使用它。 Maybe I've made a mistake, and I need to fetch some other kind of key from Google? 也许我犯了一个错误,我需要从Google那里获取其他类型的密钥吗?

Due to the nature of Google's API and the enterprise security requirements, this is a little more complicated than your average RESTful, Silicon Valley API. 由于Google API的性质和企业安全性要求,这比普通的RESTful硅谷API稍微复杂一些。 I needed to do this on a past project, and I think this will help. 我需要在过去的项目中执行此操作,我认为这会有所帮助。

First, to make querying for the data I needed easier, I used Legato , which self-describes as a “Ruby Client for the Google Analytics Core Reporting and Management API”. 首先,为了简化查询所需数据的过程,我使用了Legato ,它自称为“ Google Analytics Core Reporting and Management API的Ruby客户端”。

In order to get Legato working, you need to obtain an OAuth token from Google, which expires after a while. 为了使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

This assumes you have three environment variables corresponding to the authentication data that Google provided you: 假设您具有三个与Google提供的身份验证数据相对应的环境变量:

  1. GOOGLE_SERVICE_EMAIL, which is the same as the client email you have in your JSON object. GOOGLE_SERVICE_EMAIL,与JSON对象中的客户电子邮件相同。
  2. GOOGLE_PRIVATE_KEY_PATH, which points to the .p12 file you should have been able to download at the same time. GOOGLE_PRIVATE_KEY_PATH,它指向您应该可以同时下载的.p12文件。
  3. GOOGLE_PRIVATE_KEY_PASSPHRASE, which should literally be “notasecret”. GOOGLE_PRIVATE_KEY_PASSPHRASE,字面上应为“ notasecret”。

You can utilize the service with legato like so: 您可以像以下这样用连奏来使用该服务:

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)

Best of luck! 祝你好运!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM