Google使用OAuth2身份验证从JavaScript客户端接触API问题



已经纠结了好几个小时了,文档看起来很糟糕。基本上,我试图读取访问OAuth2认证用户的联系人,使用便携式联系人API或完整的联系人API。Google最近开始允许OAuth2。

我可以通过contacts API访问用户的联系人,首先让用户使用作用域:"https://www.google.com/m8/feeds"进行身份验证。然后我可以检索他们的前25个联系人使用jQuery(代码显示为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数据。然而,几乎令人难以置信的是,谷歌提供的唯一联系人顺序(据我所知)是"最后修改"(真的是什么?)我需要一些更像"最受欢迎的朋友"或"最受欢迎的"。

这恰好是Google Portable Contacts API可以做到的,(耶!)当然,我似乎不能让一个成功的请求工作。

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

<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>

这很好,我得到一个访问令牌传递回来。

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

$.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 Error

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

你知道我做错了什么吗?

附录


我在Google OAuth2论坛上发现了这个bug报告,该报告建议我们在使用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

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

我能想到的其他选项有:

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

不应该这么难的。

最新更新