繁体   English   中英

无法通过Google Content API for Shopping进行身份验证

[英]Trouble authenticating with Google Content API for Shopping

我正在尝试将OAuth2用于服务器到服务器应用程序 ,并结合Google的Content API for Shopping使用google-api-client gem和Ruby on Rails 3.2.5。 此外,我已按照Content API文档中的规定设置了我的商家帐户。

这是我发现能够:

  • 在后台创建/更新产品
  • 已创建产品属于我公司的Google产品“保护伞”
  • 当令牌过期时,不要求每个用户进行身份验证/授权

使用此示例中的第1 - 23行作为起点,我已经开始编写以下模块以用于后台作业:

require 'httparty'
require 'google/api_client'

module GoogleProducts
  GOOGLE_CONFIG = YAML.load_file(File.join(Rails.root, "config", "google.yml"))[Rails.env]

  CLIENT_ID = "XXXXXXXXXXXX@developer.gserviceaccount.com"
  MERCHANT_ID = "XXXXXXX"
  SCOPE = "https://www.googleapis.com/auth/structuredcontent"

  KEY_FILE_PATH = File.join(Rails.root, "config", "my-privatekey.p12")
  KEY_FILE_PASS = "XXXXXXXXXX"

  def self.add_item(item_id)
    self.fetch_token
    xml = self.gen_item_xml(item_id)
    headers = {"Content-type" => "application/atom+xml", "Content-Length" => xml.length.to_s}
    url = "https://content.googleapis.com/content/v1/#{MERCHANT_ID}/items/products/generic?access_token=#{$gp_token}"

    response = HTTParty.post(url, :body => xml, :headers => headers).parsed_response
  end

  def self.gen_item_xml(item_id)
    #building product xml
  end

  private
  def self.fetch_token
    api_client = Google::APIClient.new(:authorization => :oauth2)
    key = Google::APIClient::PKCS12.load_key(KEY_FILE_PATH, KEY_FILE_PASS)
    asserter = Google::APIClient::JWTAsserter.new(CLIENT_ID, SCOPE, key)

    begin
      api_client.authorization = asserter.authorize

      #todo - store in something other than a global
      $gp_token = api_client.authorization.access_token
    rescue Signet::AuthorizationError => e
      puts e.message
    ensure
      return $gp_token
    end
  end
end

一切似乎都运行良好 - 身份验证,身份验证令牌的处理 - 直到我尝试实际添加一个项目,当我这样做时,我得到以下内容:

<errors xmlns='http://schemas.google.com/g/2005'>
  <error>
    <domain>GData</domain>
    <code>ServiceForbiddenException</code>
    <internalReason>Could not find authenticated customer</internalReason>
  </error>
</errors>

有任何想法吗?

经过多次痛苦和精神上的辛劳,我终于解决了我的问题!

由于我使用的是OAuth 2服务器到服务器身份验证,因此hjblok给出的建议不适用(感谢给它一个镜头,但是!)。

我只是将与我的服务帐户密钥相关联的电子邮件地址从Google API控制台(例如XXXXXXXXXXXX@developer.gserviceaccount.com )添加到我的Google Merchant帐户(商家管理页面上的Settings > Users ),并且它有效。

如果需要任何澄清,请随时发表评论!

Google Content API文档说明您需要在Google Merchant Center的“设置”页面中进行设置:

https://developers.google.com/shopping-content/getting-started/usingapi-products

在深入了解Google的API文档后, EDIT重写了答案

您是否已尝试使用Google的OAuth 2.0游乐场 我能够成功访问https://content.googleapis.com/content/v1/#{MERCHANT_ID}/items/products/generic

  1. 在“第1步”中,我选择了“Content API for Shopping”,然后使用我的帐户授权API。
  2. 然后在“步骤2”中,我“交换了令牌的授权码”,这导致了“刷新令牌”和“访问令牌”。
  3. 然后在“步骤3”中,我调用了一个GET请求到https://content.googleapis.com/content/v1/1234567/items/products/generic 由于1234567不是有效的MERCHANT_ID因此返回错误。 但错误消息包含实际属于您的帐户的MERCHANT_ID
  4. 我重复了“第3步”但现在使用了正确的MERCHANT_ID 返回HTTP/1.1 200 OK ,包含正文中的请求项。

此外,我不确定,但Google API是否期望授权标头与access_token$gp_token )一起出现? OAuth 2.0操场中,此Authorization标头用于发送access_token

我还找到了结构化内容API演示页面(https://google-content-api-tools.appspot.com/demo/demo.html),该页面更适用于Content API for Shopping。

暂无
暂无

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

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