【问题标题】:Google API Client Rails谷歌 API 客户端 Rails
【发布时间】:2012-12-31 21:55:24
【问题描述】:

我正在为 ruby​​ 使用 google-api-client 客户端 gem,每次调用 API 时都会收到 403 Access Not Configured 错误。

  require 'google/api_client'
  client = Google::APIClient.new
  client.authorization = nil
  search = client.discovered_api('customsearch')
  response = client.execute( search.cse.list, 'key' => '<<MY KEY>>', 'cx' => '<<MY CX>>', 'alt' => 'json', 'q' => 'hello world')

我试图在不使用 OAuth 的情况下进行搜索,而只使用 API 密钥。

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • Google 的 API 需要 ssl 吗?
  • 有点,是的。 OAuth 2 可以,但它需要在 Google 方面。这不是你遇到的问题。
  • 谢谢。希望我能弄清楚我的问题是什么。

标签: json api google-api google-custom-search google-api-ruby-client


【解决方案1】:

我遇到了同样的问题,我是这样解决的:

Google 帐户设置:

  1. 转到 Google API (https://code.google.com/apis/console/)。
  2. 在“服务”下启用您想要使用的服务(例如 Analytics API)。
  3. 在“API 访问”下,通过单击蓝色大按钮创建 OAuth 客户端 ID。
  4. 在下一个屏幕上输入您的产品信息(名称、徽标、网址)。
  5. 在下一个屏幕上,由于通信将由服务器处理,我们选中“服务帐户”选项并单击“创建客户端 ID”按钮。
  6. 下载刚刚生成的私钥,放到({R​​ails.root}/config/.p12)。
  7. 让 API 访问页面保持打开状态,因为您将在下一步中需要一些参数值。
  8. 在新选项卡中,转到https://developers.google.com/products/ 并选择您要使用的服务。在左侧菜单中导航到配置 > 管理 API (v3) > 资源 > 授权 (https://developers.google.com/analytics/devguides/config/mgmt/v3/mgmtAuthorization)。在下表中,您将找到适当的 ":scope" 参数 url(例如 https://www.googleapis.com/auth/analytics.readonly)。这样您就可以找到合适的范围。
  9. 请注意,“:issuer”参数是显示在客户端 ID 旁边的服务帐户的电子邮件地址(例如 @developer.gserviceaccount.com)。
  10. 用于检查 URL(例如,https://developers.google.com/youtube/analytics/v1/ 将是 youtubeAnalytics,v1)。我通常会在谷歌上找到这些例子:)。
  11. 请注意,这是“公钥指纹”值。
  12. 请检查https://github.com/google/google-api-ruby-client 处的源代码以获取每个返回的对象。
  13. 也许您必须将发行人电子邮件地址添加到您的 Google Analytics(分析)帐户。

Ruby on Rails 代码:

# creating client instance
client = Google::APIClient.new

# authenticating
key = Google::APIClient::PKCS12.load_key("#{Rails.root}/config/<STRANGE_LONG_FILENAME>.p12", 'notasecret')
client.authorization = Signet::OAuth2::Client.new(
  :token_credential_uri => 'https://accounts.google.com/o/oauth2/token',
  :audience => 'https://accounts.google.com/o/oauth2/token',
  :scope => '<SCOPE_URL>',
  :issuer => '<HASH>@developer.gserviceaccount.com',
  :signing_key => key)
client.authorization.fetch_access_token!

# API call
# NOTE: Check the documentation for API methods and parameters). The method discovered_api returns a service object. We can use to_h.keys to get the list of available keys of that object. Keys represents API methods (e.g. "analytics.management.accounts.list" the API method path is "management.accounts.list").
result = client.execute(
  :api_method => client.discovered_api('<SERVICE_NAME>', 'v3').management.accounts.list,
  :parameters => { accountId: '~all', webPropertyId: '~all'}
)
if result.success?
    result.data
end

【讨论】:

    【解决方案2】:

    访问未配置意味着它是一个 API,需要在 API 控制台中注册您的项目,并从服务选项卡中打开自定义搜索 API。您的客户端由 OAuth 令牌或 API 密钥标识。必须提供一个或两个。我怀疑您只是未能在服务选项卡中打开 API,因为您的示例包含 API 密钥参数。

    您也可以尝试更明确地传递参数:

    result = client.execute(
      :api_method => search.cse.list,
      :key => '<<MY KEY>>',
      :parameters => {
        'cx' => '<<MY CX>>',
        'alt' => 'json',
        'q' => 'hello world'
      }
    )
    

    【讨论】:

    • 谢谢,虽然服务选项卡的键仍然打开。我还使用“简单 API 访问”Web 浏览器密钥。如果我将代码用于他们生成的引擎之一,它可以工作,但由于某种原因这不会。
    • 不确定...是否可以尝试使用服务帐户?
    猜你喜欢
    • 2017-10-28
    • 2015-08-24
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    相关资源
    最近更新 更多