4

是否有可能会在过去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

要重现我所做的问题:

  1. 使用电子邮件和密码登录
  2. 关闭应用程序(浏览器的选项卡)之前(我尝试了 1 分钟的会话,但其他长度的会话也一样)
  3. 等到登录会话过期
  4. 打开应用程序(此时上面的代码运行并产生上面的输出)

有任何想法吗?

4

1 回答 1

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()可能看起来是过去的原因。

于 2014-11-08T00:06:36.913 回答