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

时间:2014-11-06 12:37:15

标签: firebase firebasesimplelogin

getAuth()过去可能会返回expires的对象吗?

我的印象是,如果过去expiresgetAuth()将返回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. 打开应用程序(此时上面的代码运行并生成上面的输出)
  5. 有什么想法吗?

1 个答案:

答案 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()返回的过期似乎是过去的原因。