2

我的应用程序仅使用 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/ 这一定是一个错误,我真的希望谷歌尽快处理它,因为它吓跑了用户。

4

2 回答 2

0

immediate:falseaskAuth方法中的参数是原因。亚伯拉罕提到的帖子解释了背景。

由于该方法可用于处理授权流程的编程启动,并且您应该使用动态回调,gapi.auth.authorize()因此在大多数情况下通常应避免使用该方法。有关监视用户会话状态的信息解释了如何以及何时触发您的登录回调函数,以及如何使用身份验证结果对象中的值来确定他们之前是否已授权您的应用、登录(或退出) ) 的应用程序,或登录(或退出)谷歌。gapi.auth.signIn()

您的 checkAuth 和 askAuth 函数将有效地结合起来检查身份验证结果对象的状态并采取相应措施。您的电子邮件按钮点击事件将触发gapi.auth.signIn()您的应用程序的必要参数和范围。

于 2013-12-29T05:42:24.613 回答
0

我刚刚遇到了与 drive.readonly 范围完全相同的问题,因为我解决它的方法是始终使用立即 = false 调用授权。这还不错,因为当您为已授权的用户执行此操作时,Google 会在几分之一秒内打开弹出窗口,但随后会立即关闭它(显然是利用在浏览器事件处理程序中打开弹出窗口的机会如果用户确实需要授权)。

奇怪的是,对于我之前使用 immediate = true 的本地主机服务器,我继续看到脱机访问请求 - 但在生产服务器上我到目前为止还没有看到它们,手指交叉。

于 2014-01-13T18:56:06.950 回答