1

我正在为 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 密钥。

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

4

2 回答 2

1

我有同样的问题,我是这样解决的:

谷歌账户设置:

  1. 转到 Google API ( https://code.google.com/apis/console/ )。
  2. 在“服务”下启用您想要使用的服务(例如 Analytics API)。
  3. 在“API 访问”下,通过单击蓝色大按钮创建 OAuth 客户端 ID。
  4. 在下一个屏幕上输入您的产品信息(名称、徽标、网址)。
  5. 在下一个屏幕上,由于通信将由服务器处理,我们选中“服务帐户”选项并单击“创建客户端 ID”按钮。
  6. 下载刚刚生成的私钥,放到({Rails.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
于 2013-05-09T21:15:09.207 回答
0

未配置访问意味着它是一个 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'
  }
)
于 2013-01-02T17:16:21.623 回答