Google Javascript客户端库OAUTH要求提供脱机访问权限,但从未请求过

时间:2013-12-27 21:47:33

标签: javascript google-api google-plus google-oauth google-api-js-client

我的应用程序仅使用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();
    ...
});

现在,如果用户第一次来,他按下“发送电子邮件”按钮时会被问到正确的权限。当用户重新加载页面时,无缝权限检查会返回失败,当用户点击“发送电子邮件”按钮时,我们会再次打开Goog​​le授权弹出窗口,现在它会要求提供“脱机访问”权限。   这看起来不正确,因为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/ 这肯定是一个错误,我真的希望谷歌尽快处理它,因为它会吓跑用户。

2 个答案:

答案 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服务器,我继续看到离线访问请求 - 但是在生产服务器上我到目前为止还没见过它们,手指交叉。