getAuth()
过去可能会返回expires
的对象吗?
我的印象是,如果过去expires
,getAuth()
将返回null
。但是,看起来我错了。
以下是我证明错误的原因:
var resolve = {
auth: function($q) {
var defer = $q.defer();
var authData = rootRef.getAuth();
if (authData === null) {
...
} else {
var now = new Date() / 1000;
console.log('Authenticated!');
console.log(' Auth expiry: ' + authData.expires);
console.log(' Now: ' + now);
console.log('Is expiry in the past? ' + (authData.expires < now ? 'YES' : 'NO'));
defer.resolve();
}
return defer.promise;
}
};
这是输出:
Authenticated!
Auth expiry: 1415276774
Now: 1415276804.45
Is expiry in the past? YES
如果我在获得上述输出后刷新页面,getAuth()
会按预期返回null
。
重现我的问题:
有什么想法吗?
答案 0 :(得分:2)
正如Chris在评论中提到的,这似乎是由于客户端和服务器时间之间的差异。验证有效负载中指定的expires
时间是由服务器使用服务器的时间生成的,但这可能至少与您的客户端略有不同。要记住的重要一点是客户端确实已使用您指定的TTL过期,由服务器强制执行。
我创建了一个简单的示例来每秒调用getAuth()
,并记录每个请求的到期时间和当前本地时间之间的差异。在多次迭代中测试时,每个迭代看起来如下:
...
session time remaining: 2.23s
session time remaining: 1.23s
session time remaining: 0.23s
session time remaining: -0.76s
session time remaining: -1.77s
session expired
session expired
session expired
...
简而言之,一旦会话过期,服务器会立即通知客户端,但客户端的时间戳会有几秒钟的不同,这就是为什么从getAuth()
返回的过期似乎是过去的原因。