已经纠结了好几个小时了,文档看起来很糟糕。基本上,我试图读取访问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请求上设置请求头。有关更多信息,请参阅此问题的答案。
我能想到的其他选项有:
- 使用Google Contacts API JS库。它只使用谷歌自己认为不好的AuthSub。我宁愿不做这件事。与我交互的其他所有服务都使用OAuth2。
- 使用我链接到的SO问题中提到的新的2级Ajax和XDomainRequest标准。然而,他们也会有自己的问题。这听起来像是一团糟。它不会在旧的浏览器工作,我将不得不做一堆功能检测等。我甚至不知道API是否会支持这些功能。
- 在服务器上完成。这也不是完全理想的。不够完美的用户体验。
不应该这么难的。