3

こんにちは、Firebase は初めてですが、とても気に入っています。

私はこれを読みました: https://www.firebase.com/docs/security/custom-login.htmlそして、JWT を正常に作成し、Firebase アカウントに対して認証することができます。わーい!

ただし、これが将来の Firebase へのその後の呼び出しに何を意味するのかはわかりません。Firebase への今後のすべてのリクエストで、このトークンを渡す必要がありますか?

4

1 に答える 1

7

同じページ内での Firebase への今後の呼び出しでは、同じ認証が使用されます。ドキュメントから:

任意の参照で認証を行うと、そのクライアントが Firebase 全体に対して認証されます。インターネット接続が失われた場合、Firebase は再び認証をシームレスに処理するため、アプリで操作を 1 回実行するだけで済みます。クライアントの資格情報を変更するには (たとえば、ユーザーが別のアカウントにログインする場合)、新しいトークンで再認証するだけです。

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;
      }
   }
于 2013-08-18T03:49:33.247 に答える