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>
何か案は?