为什么Firebase的getAuth()会返回一个过期到期的对象

可能
getAuth()会在过去返回一个过期的对象吗?

我的印象是,如果过期,则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分钟的会话,但其他长度的会话也是如此)
>等到登录会话到期
>打开应用程序(此时上面的代码运行并生成上面的输出)

有任何想法吗?

最佳答案 正如克里斯在评论中提到的,这似乎是由于客户端和服务器时间之间的差异.验证有效负载中指定的到期时间由服务器使用服务器的时间生成,但这可能至少与您的客户端略有不同.需要记住的重要一点是,客户端确实已使用您指定的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()返回的到期可能看起来是过去的原因.

点赞