如何向 AngularFire 注册 JWT 令牌过期事件?(AngularFire Custom Authentica



如何向 AngularFire 注册 JWT 令牌过期事件?

现在我让我的Rails服务器向AngularJS客户端发送JWT,该客户端将在60秒后过期。我已成功连接到客户端上的 Firebase。60 秒后,它会过期,并且我在浏览器控制台中收到"FIREBASE 警告:身份验证() 已取消:身份验证令牌已过期"消息。

我不清楚这个事件要注意什么。我的目标是在当前令牌过期时调用我的服务器以获取新令牌。

客户端代码片段:这是我初始化 Firebase OBJ 并监视网址

var ref = new Firebase(URL);
// Create a callback which logs the current auth state
var authDataCallback = function (authData) {
  if (authData) {
    console.log("User " + authData.uid + " is logged in with " + authData.provider);
  } else {
    console.log("User is logged out", authData);
  }
}
// Register the callback to be fired every time auth state changes
ref.onAuth(authDataCallback);
var authHandler = function(error, authData) {
  if(error) {
    console.log("Login Failed!", error);
  } else {
    console.log("Login Succeeded!", authData);

    var firebaseBal = $firebase(ref).$asObject();
    // update balance when val changes
    firebaseWatch = firebaseBal.$watch(function(newVal, oldVal) {
      $scope.balance = firebaseBal.$value;
    });
  }
}
// Authenticate users with a custom Firebase token
ref.authWithCustomToken(Auth.firebaseToken(), authHandler);

服务器代码片段(我使用 firebase-token-generator 来生成我的 JWT 代币):

generator = Firebase::FirebaseTokenGenerator.new(secret);
payload = { :uid => "123" }
# expired in a minute, for testing
expires = Time.now.to_i + (60*1)
options = {:expires => expires}
token = generator.create_token(payload, options)
// this is then sent to the client
即将

解决的问题,请参阅 GitHub 问题 - https://github.com/firebase/angularfire/issues/514

此 GitHub 问题的存在是为了帮助您完成 你想完成什么:)简短的回答是,我们没有 现在真的支持这一点。

目前,您将不得不使用 $extendFactory() 并将您的 $$error() 方法中的逻辑。这是关于这一点的苗条文档。这 $$error() 方法将在身份验证因令牌而失败后触发 过期或安全规则。

您应该在未来几周内看到这方面的改进,并且 标记为 1.0.0 版本。

var ref = new Firebase(URL);
var authHandler = function(error, authData) {
  if(error) {
    console.log("Login Failed!", error);
  } else {
    console.log("Login Succeeded!", authData);
    // create a factory to pass into $firebase
    var timeoutErrorFactory = $FirebaseObject.$extendFactory({            
      $$error: function(data) {
        // TODO: not sure if super needs to be applied
        // var err = $FirebaseObject.prototype.$$error.apply(this, arguments);
        console.log('firebase timeout error cleanup', data.code);
        // TODO: call server for a new token
      }
    });
    // create an instance which uses the customized factory
    firebaseBal = $firebase(ref, {objectFactory: timeoutErrorFactory}).$asObject();
    // update balance when val changes
    firebaseWatch = firebaseBal.$watch(function(newVal, oldVal) {
      $scope.balance = firebaseBal.$value;
    });
  }
}
// Authenticate users with a custom Firebase token
ref.authWithCustomToken(Auth.firebaseToken(), authHandler);

最新更新