Google通过OAuth2身份验证与JavaScript客户端联系API问题

时间:2011-09-13 10:45:14

标签: javascript oauth-2.0 google-contacts

现在摔跤了好几个小时,Docs似乎很糟糕。基本上,我正在尝试使用Portable Contacts API或完整版Contacts API来获取对OAuth2经过身份验证的用户联系人的读取权限。 Google recently已启动allowing OAuth2

我可以通过首先让用户对范围进行身份验证来通过Contacts 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便携式联系人API can do,(耶!)。当然,我似乎无法获得成功的工作要求。

首先,我让用户通过点击此链接对便携式联系人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论坛中找到了this bug report,该论坛建议我们在使用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

1 个答案:

答案 0 :(得分:6)

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

据我所知,替代方案是:

  1. 使用Google Contacts API JS library。这只使用了谷歌自己暗示不好的AuthSub。我宁愿不这样做。我与之交互的每个其他服务都使用OAuth2。
  2. 使用我链接的SO问题中提到的新的Level 2 Ajax和XDomainRequest标准。然而,他们会遇到自己的问题。整个听起来像是一团糟。它不适用于旧浏览器,我将不得不进行一系列功能检测等。我甚至不知道API是否支持这些功能。
  3. 在服务器上完成所有操作。这也不完全理想。不太完美的用户体验。
  4. 谷歌不应该这么困难。