3

google-api-client gemと Ruby on Rails 3.2.5を使用して、 Google の Content API for Shoppingと組み合わせてサーバー ツー サーバー アプリケーションに OAuth2を使用しようとしています。また、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>

何か案は?

4

3 に答える 3

6

多くの苦悩と精神的苦労の後、私はついに私の問題を解決しました!

私はOAuth 2 Server to Server 認証を使用しているため、hjblok が提供した提案は適用されませんでした (ただし、試してくれてありがとう!)。

サービス アカウント キーに関連付けられたメール アドレスを Google API コンソール (例: XXXXXXXXXXXX@developer.gserviceaccount.com) から Google マーチャント アカウント (Settings > Usersマーチャント管理ページ) に追加しただけで、機能しました。

説明が必要な場合は、お気軽にコメントしてください。

于 2012-09-11T21:35:23.403 に答える
0

Google Content API のドキュメントには、Google Merchant Center の [設定] ページで設定する必要があると記載されています。

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

于 2012-09-05T02:06:53.697 に答える
0

EDITは、GoogleのAPIドキュメントに飛び込んだ後、答えを書き直しました

Google のOAuth 2.0 Playgroundを使用しようとしましたか? に無事アクセスできましたhttps://content.googleapis.com/content/v1/#{MERCHANT_ID}/items/products/generic

  1. 「ステップ 1」で「Content API for Shopping」を選択し、自分のアカウントで API を承認しました。
  2. 次に、「ステップ 2」で「トークンの認証コードを交換」しました。これにより、「リフレッシュ トークン」と「アクセス トークン」が生成されます。
  3. GET次に、「ステップ 3」で、 へのリクエストを呼び出しましたhttps://content.googleapis.com/content/v1/1234567/items/products/generic1234567は有効ではないためMERCHANT_ID、エラーが返されます。ただし、エラー メッセージには、MERCHANT_ID実際にはアカウントに属する が含まれています。
  4. 「ステップ 3」を繰り返しましたが、正しいMERCHANT_ID. HTTP/1.1 200 OK要求されたアイテムを本文に含むを返します。

さらに、よくわかりませんが、Google API は Authorization ヘッダーがaccess_token( $gp_token) と共に存在することを期待していませんか? OAuth 2.0 プレイグラウンド内では、この Authorization ヘッダーを使用してaccess_token.

Content API for Shopping に特化した Structured Content API のデモ ページ (https://google-content-api-tools.appspot.com/demo/demo.html) も見つけました。

于 2012-09-08T07:53:28.233 に答える