我的应用程序仅使用 Javascript 与 Google 交互。它要求用户个人资料访问、电子邮件访问和联系人管理权限。加载页面后,应用程序会检查用户是否已授予这些权限,如果已授予,则获取访问令牌。
这是一些示例代码:
var GoogleContacts = {
...
checkAuth: function(){
gapi.auth.authorize({
client_id: googleKeys.clientId,
scope: googleKeys.scopes,
immediate: true
},
jQuery.proxy(this.handleAuthResult, this)
);
},
askAuth: function(){
gapi.auth.authorize({
client_id: googleKeys.clientId,
scope: googleKeys.scopes,
immediate: false
},
jQuery.proxy(this.handleAuthResult, this)
);
}
...
}
……
function handleGoogleApiLoad(){
gapi.client.setApiKey(googleKeys.apiKey);
gapi.auth.init(function(){console.info('popup api ready')});
setTimeout(function(){GoogleContacts.checkAuth();}, 300);
}
……
$('#emailButton').click(function() {
if(!accessToken)
GoogleContacts.askAuth();
...
});
现在,如果用户是第一次来,当他按下“发送电子邮件”按钮时会询问他正确的权限。当用户重新加载页面时,无缝权限检查返回失败,当用户点击“发送电子邮件”按钮时,我们再次打开 Google 授权弹出窗口,它现在要求离线访问权限。
这似乎不正确,因为 JS api 对离线访问没有实际用途。
看起来这个问题是在谷歌发布增量身份验证功能后开始的:http: //googleplusplatform.blogspot.co.il/2013/12/google-sign-in-improvements11.html
这是一个很快就会修复的错误,还是应该我们以某种方式更改代码以免将我们的用户与奇怪的权限请求混淆?
更新:
我曾尝试使用 plus api 和gapi.auth.signIn()
方法,但结果相同。显然,这个问题取决于范围,因为当我只使用登录范围时,一切都按预期工作,但添加谷歌联系人访问范围 https:||www.google.com/m8/feeds/ 总是导致离线访问第二次进入页面时请求。这是一个确认这一点的小提琴:http: //jsfiddle.net/hjLM6/6/
这一定是一个错误,我真的希望谷歌尽快处理它,因为它吓跑了用户。