我正在开发一个包含两个简单页面和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”时,我不必继续对每一次后续通话进行身份验证,我做错了什么?
答案 0 :(得分:1)
如果这些是真正的两个不同的页面(而不是一个页面已经对服务器进行了一些AJAX或其他调用以获取其他数据),那么每个页面都有一个完全不同的JavaScript环境。这意味着gapi
对象在每个页面上都是不同的副本,并且您在第一页上设置的身份验证尚未在第二页上的gapi
对象上设置。您没有为会话设置令牌 - 您在特定的JavaScript对象上设置它。
如果您使用的是Google+ Sign In之类的内容,您可以将按钮放在每个页面上,每个页面在用户访问时都会获得自己的令牌,但这有点效率低,因为它也意味着每次往返服务器。
您可能还可以执行类似将身份验证令牌放入临时/会话本地存储的操作,但在这种情况下您应该小心,令牌不会泄漏并导致安全问题。
还有其他可能的解决方案,但它实际上归结为您打算如何将经过身份验证的用户用作客户端。