Firebase JWT身份验证,持续发送令牌?

时间:2013-08-17 15:07:42

标签: authentication firebase jwt

嗨,我是Firebase的新手,但真的很喜欢它。

我读了这个:https://www.firebase.com/docs/security/custom-login.html,我能够成功创建JWT并对我的Firebase帐户进行身份验证。耶!

但是我不确定这对未来的Firebase后续调用意味着什么。我是否需要在以后的所有Firebase请求中传递此令牌?

1 个答案:

答案 0 :(得分:7)

在同一页面内对Firebase的未来调用将使用相同的身份验证。来自文档:

对任何参考进行身份验证都会将该客户端验证到整个Firebase,如果其互联网连接丢失,Firebase将无缝再次进行身份验证,因此您只需在应用中执行一次操作即可。要更改客户端的凭据(例如,当用户登录到其他帐户时),只需使用新令牌重新进行身份验证。

var ref = new Firebase(URL);

ref.on('value', ...) // not authenticated

ref.auth(TOKEN, function(error) {
    if( !error ) {
       ref.on('value', ...); //authenticated

       ref.child('...').on('value', ...); //also authenticated

       new Firebase(URL); // also authenticated if I'm using the same URL
    }
});

ref.on('value', ...); // probably not authenticated (async call to auth probably not completed)

如果您希望此令牌在页面重新加载后继续存在,那么您需要以某种方式存储它,以便客户端可以在新页面上调用firebaseRef.auth(...)。

var ref = new Firebase(URL);

// fetch a token stored in localStorage on a previous page load
var token = localStorage.getItem('token');
if( !token || !tokenHasTimeLeft(token) ) { 
    token = fetchTokenFromServer(); /* some API call to your custom auth server */-
}
login(token);

function login(token) {
   ref.auth(token, function(error) {
       /** handle errors */
       localStorage.setItem('token', token); // store for future page loads
   });
}

// this method uses Base64.decode by Fred Palmer 
// https://code.google.com/p/javascriptbase64/
// it checks to see if the token stored has more
// than 12 hours left before it expires
function tokenHasTimeLeft(tok) {
      try {
         var body = JSON.parse(Base64.decode(tok.split('.')[1]));
         var exp = body.exp? moment.unix(body.exp) : moment.unix(body.iat).add('hours', 24);
         DEVMODE && console.log('parsed token', body);
         return exp.diff(moment(), 'hours') > 12;
      }
      catch(e) {
         console.warn(e);
         return false;
      }
   }