我的应用程序仅使用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没有实际用于离线访问。
Google发布增量身份验证功能后,似乎已启动此问题:http://googleplusplatform.blogspot.co.il/2013/12/google-sign-in-improvements11.html
这是一个很快就会修复的错误,还是我们应该以某种方式更改代码,以免混淆我们的用户与奇怪的权限请求?
更新
我尝试使用plus api和gapi.auth.signIn()
方法,但结果相同。
显然,此问题与范围有关,因为当我仅使用登录范围时,一切都按预期工作,但添加Google联系人访问范围https:|| www.google.com/m8/feeds/始终会导致Offline Access第二次进入页面时请求。这是确认这一点的小提琴:http://jsfiddle.net/hjLM6/6/
这肯定是一个错误,我真的希望谷歌尽快处理它,因为它会吓跑用户。
答案 0 :(得分:0)
immediate:false
方法中的askAuth
参数是原因。 post that Abraham mentions解释了背景。
在大多数情况下,通常应该避免使用gapi.auth.authorize()
方法,因为授权流程的gapi.auth.signIn()
method is available to handle programatic initiation以及您应该使用动态回调。有关monitoring a user's session state的信息说明了如何以及何时启用登录回调功能以及如何使用auth结果对象中的值来确定他们之前是否已授权您的应用,已登录(或已注销)您的应用程序,或登录(或退出)谷歌。
您的checkAuth和askAuth函数将被有效地组合以检查auth结果对象的状态并相应地执行操作。您的电子邮件按钮点击事件将触发gapi.auth.signIn()
,其中包含您应用的必要参数和范围。
答案 1 :(得分:0)
我对drive.readonly范围只有完全相同的问题,因为我的工作方式是值得的,总是使用immediate = false调用authorize。这并不是那么糟糕,因为当你为已经授权的用户执行此操作时,Google将打开弹出窗口几分之一秒,但随后将立即关闭它(显然利用在浏览器事件处理程序中打开弹出窗口的机会)如果用户确实需要授权)。
奇怪的是,对于我以前使用immediate = true的localhost服务器,我继续看到离线访问请求 - 但是在生产服务器上我到目前为止还没见过它们,手指交叉。