7

已经为此挣扎了好几个小时,文档似乎很糟糕。基本上,我正在尝试使用Portable Contacts API或完整的Contacts API获得对 OAuth2 身份验证用户联系人的读取访问权限。Google最近开始允许 OAuth2

我可以通过联系人 API 访问用户联系人,方法是首先让用户使用范围进行身份验证:“https://www.google.com/m8/feeds”。然后我可以使用 jQuery 检索他们的前 25 个联系人(显示的代码是CoffeeScript

$.ajax
  url: "https://www.google.com/m8/feeds/contacts/default/full"
  dataType: 'jsonp'
  data: { access_token: token, alt: 'json-in-script' }
  success: (data, status) ->
    console.log "The returned data", data

那行得通,我得到了 JSON 数据。然而,几乎令人难以置信的是,谷歌提供的唯一联系顺序(据我所知)是“ lastmodified ”(真的是 wtf?)。我需要更像“顶级朋友”或“最受欢迎”的东西。

这恰好是 Google Portable Contacts API可以做的事情,(耶!)。当然,我似乎无法获得成功的工作请求。

首先,我通过单击此链接让用户使用便携式联系人 API 进行身份验证(注意范围:“https://www-opensocial.googleusercontent.com/api/people”)

<a href="https://accounts.google.com/o/oauth2/authclient_id=457681297736.apps.googleusercontent.com&response_type=token&redirect_uri=http://localhost:3000/team&scope=https://www-opensocial.googleusercontent.com/api/people">Import Google Contacts</a>

这很好用,我得到了一个传回的访问令牌。

接下来我尝试向便携式联系人 API 发送一个 ajax 请求

$.ajax
  url: "https://www-opensocial.googleusercontent.com/api/people/@me/@all"
  dataType: 'jsonp'
  data: { access_token: token, alt: 'json-in-script' }
  success: (data, status) ->
    console.log "The returned data", data

但这会返回 403 错误

403 (The currently logged in user and/or the gadget requesting data, does not have access to people data.

任何想法我做错了什么?

附录
我在 Google OAuth2 论坛中发现了这个错误报告,该报告建议我们在使用 Portable Contacts API 时需要设置授权标头。所以我这样尝试:

$.ajax
  url: "https://www-opensocial.googleusercontent.com/api/people/@me/@all"
  dataType: 'jsonp'
  data: { access_token: token, alt: 'json-in-script' }
  beforeSend: (xhr) ->
    xhr.setRequestHeader "Authorization", "OAuth #{token}"
  data: { access_token: token }
  success: (data, status) ->
    console.log "The returned data", data

但这让我遇到了同样的 403 错误:

403 (The currently logged in user and/or the gadget requesting data, does not have access to people data
4

1 回答 1

6

问题是您显然无法在 JSONP 请求上设置请求标头。有关更多信息,请参阅此问题的答案。

据我所知,替代方案是:

  1. 使用Google 联系人 API JS 库。那只使用谷歌自己建议的 AuthSub 是不好的。我宁愿不这样做。我与之交互的所有其他服务都使用 OAuth2。
  2. 使用我链接到的 SO 问题中提到的新的 2 级 Ajax 和 XDomainRequest 标准。然而,他们会带来自己的问题。这听起来像一团糟。它不适用于旧浏览器,我将不得不做一堆功能检测等。我什至不知道 API 是否会支持这些功能。
  3. 在服务器上完成所有操作。这也不完全理想。不如完美的用户体验。

谷歌不应该这么难。

于 2011-09-15T16:58:40.820 回答