Google Plus api 调用未经身份验证

Google Plus api calls not authenticated

本文关键字:身份验证 调用 Plus api Google      更新时间:2023-09-26

我正在开发一个原型,其中包含两个简单的页面和谷歌加集成。我有两个页面,第一个带有"登录"按钮,第二个带有链接。当用户单击登录按钮时,我正在调用:

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"时,我不必继续验证每个后续调用,我做错了什么?

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

如果您使用的是Google+登录之类的内容,则可以将按钮放在每个页面上,当用户访问每个页面时,每个页面都会获得自己的令牌,但这有些效率低下,因为这也意味着每次往返服务器。

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

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