2013-08-17 5 views
3

Привет, я новичок в Firebase, но мне это очень нравится.Аутентификация JWT Firebase, постоянная отправка токена?

Я прочитал: https://www.firebase.com/docs/security/custom-login.html и я могу успешно создать JWT и пройти аутентификацию против моей учетной записи Firebase. Ура!

Однако я не уверен, что это значит для будущего, последующие призывы к Firebase. Нужно ли передавать этот токен во все будущие запросы Firebase?

ответ

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; 
     } 
    }