0

我正在开发一个带有两个简单页面和 google plus 集成的原型。我有两个页面,第一个带有“登录”按钮,第二个带有链接。当用户单击登录按钮时,我正在调用:

var params = {"client_id":"<client_id>", "scope":"https://www.googleapis.com/auth/plus.login"}; 
gapi.auth.authorize(params, signinCallback);

signinCallback看起来像这样:

var signinCallback = function(authResult) {
  if (authResult['access_token']) {
    gapi.auth.setToken(authResult);

    gapi.client.load('plus','v1', function(){
      var request = gapi.client.plus.people.list({
        'userId': 'me',
        'collection': 'visible'
      });

      request.execute(function(resp) {
        console.log(resp);
      });
    });

  } else if (authResult['error']) {
      console.error('Sign-in state: ' + authResult['error']);
  }
}

因此,当用户单击按钮、登录并提供应用程序权限时,我将存储令牌并进行人员列表调用。这一切都很完美。

我的问题是当我导航到第二页并尝试拨打我之前拨打的电话时:

gapi.client.load('plus','v1', function(){
  var request = gapi.client.plus.people.list({
    'userId': 'me',
    'collection': 'visible'
  });
  request.execute(function(resp) {
    console.log(resp);
  });
});

调用失败并出现以下错误:Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.

我想当我最初注册后做“setToken”时,我不必继续验证每个后续调用,我做错了什么?

4

1 回答 1

1

如果这些确实是两个不同的页面(而不是一个对您的服务器进行了一些 AJAX 或其他调用以获取额外数据的页面),那么每个页面都有一个完全不同的 JavaScript 环境。这意味着该gapi对象是每个页面上的不同副本,并且您在第一页上设置的身份验证尚未gapi在第二页上的对象上设置。您没有为会话设置令牌 - 您是在特定的 JavaScript 对象上设置它。

如果您使用的是Google+ Sign In之类的东西,您可以将按钮放在每个页面上,并且每个页面在用户访问它时都会获得自己的令牌,但这有点低效,因为这也意味着往返服务器每次。

您可能还可以执行一些操作,例如将身份验证令牌放入临时/会话本地存储中,但在这种情况下您应该小心,令牌不会泄漏并导致安全问题。

还有其他潜在的解决方案,但归结为您打算如何将经过身份验证的用户用作客户端的一部分。

于 2013-10-17T12:23:22.720 回答