使用2lo从Marketplace应用访问Google Directory API

时间:2013-07-30 20:41:57

标签: ruby oauth google-apps-marketplace google-admin-sdk 2-legged

过去几天我一直在尝试使用Ruby访问Google的Directory API,但却无法让它正常运行。根据{{​​3}}文档,可以使用2lo授权Directory API:

  

如果您的应用程序具有某些不寻常的授权要求,例如在请求数据访问(混合)或域范围授权(2LO)的同时登录,则您当前无法使用OAuth 2.0令牌。在这种情况下,您必须使用OAuth 1.0令牌和API密钥。您可以在API API控制台的API访问窗格的“简单API访问”部分中找到应用程序的API密钥。

我目前有工作代码,可以使用2lo访问Provisioning API。从文档中可以看出,通过向请求添加API访问密钥参数并启用一些权限,我可以使用相同的代码访问Directory API。但是,它不起作用,我不知道为什么。

以下是请求代码:

def self.get_user2(email)
  @client = Google::APIClient.new(:authorization => :two_legged_oauth_1)
  @client.authorization.client_credential_key = GOOGLE_APP_KEY
  @client.authorization.client_credential_secret = GOOGLE_APP_SECRET
  @directory = @client.discovered_api('admin', 'directory_v1')
  result = @client.execute(
    @directory.users.get, 
    'userKey' => email,
    :key => GOOGLE_API_KEY
  )
  JSON.parse(result.body)
end

这让我得到了回应:

{
  "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "authError",
    "message": "Invalid Credentials",
    "locationType": "header",
    "location": "Authorization"
   }
  ],
  "code": 401,
  "message": "Invalid Credentials"
 }
}

我已将所需范围添加到我的清单文件

<Scope id="usersAPI">
  <Url>https://www.googleapis.com/auth/admin.directory.user.readonly</Url>
  <Reason>See all users in your company.</Reason>
</Scope>

并在API控制台中启用了我的项目的Admin SDK。

以下是将Faraday.default_connection.response :logger添加到我的development.rb文件后的日志输出:

get https://www.googleapis.com/admin/directory/v1/users/brian@crushing.mygbiz.com?key=AIzaSyAHYBWlC_qiihRtTKTZleZlAw2ts8Q1WO8
User-Agent: "google-api-ruby-client/0.6.4 Mac OS X/10.8.4"
Authorization: "OAuth oauth_consumer_key=\"76548528623.apps.googleusercontent.com\", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\"1375899810\", oauth_nonce=\"de4d976eed6883a06b3f6084e3dd0db4\", oauth_version=\"1.0\", oauth_signature=\"3D7aqhBeaCYOYyaF8bWpaM9MA8U%3D\""
Cache-Control: "no-store"
Content-Type: "application/x-www-form-urlencoded"
401
www-authenticate: "AuthSub realm=\"https://www.google.com/accounts/AuthSubRequest\""
content-type: "application/json; charset=UTF-8"
date: "Wed, 07 Aug 2013 18:23:30 GMT"
expires: "Wed, 07 Aug 2013 18:23:30 GMT"
cache-control: "private, max-age=0"
x-content-type-options: "nosniff"
x-frame-options: "SAMEORIGIN"
x-xss-protection: "1; mode=block"
server: "GSE"
connection: "close"

在过去的一天搜索互联网后,我不知道为什么这不起作用。任何想法?

1 个答案:

答案 0 :(得分:1)

事实证明我错过了'xoauth_requestor_id'字段。感谢sqrrrl在github

上回答我的问题