2016-12-21 2 views
1

Ich habe eine Frage, die ich glaube nicht, wurde zuvor beantwortet. Ich bin derzeit auf der Suche nach etwas in Firebase ähnlich einer PHP-Sitzung.Wie umleiten, wenn Benutzer NICHT in Firebase angemeldet ist

Sie sehen, wenn ich mich von meiner Web-App abmelde, wird der Benutzer zurück in die Login-Seite umgeleitet, wie sie sein sollten. Sie können jedoch weiterhin direkte URLs wie home.html eingeben und den Anmeldebildschirm umgehen.

Ich frage mich, wie dies passieren kann, wenn onAuthStateChanged aufgerufen wird, wenn die Seite geladen wird. Es wäre sinnvoll, sie sofort umzuleiten, ähnlich wie in einer Sitzung. Leider sind sie nicht.

Dies ist der Code, der login.html und dashboard.html aufrufen, wenn sie geladen sind. Kann jemand Fehler erkennen, die dieses Problem verursachen könnten? Vielen Dank!

App.js

(function(){ 
const config ={ 
apiKey: " :) ", 
authDomain: " :)", 
databaseURL: " :) ", 
storageBucket: " :)", 
messagingSenderId: ":)" 
}; 
firebase.initializeApp(config); 
    //Grab Login Elements 
const loginBtn = document.getElementById('sign-in-btn'); 
const emailTxt = document.getElementById('user-email'); 
const passTxt = document.getElementById('user-password'); 


//Set the click event to sign the user in 
loginBtn.addEventListener('click', e => { 
const email = emailTxt.value; 
const password = passTxt.value; 
const auth = firebase.auth(); 
//Actually Sign In 
const promise = auth.signInWithEmailAndPassword(email, password); 
promise.catch(e=> console.log(e.message)); 
}); 
//Realtime Authstate Listener 

firebase.auth().onAuthStateChanged(firebaseUser => { 
    if(firebaseUser){ 
     window.location = 'dashboard.html' 
    }else{ 
     window.location = 'login.html' 
    } 
}); 
}()); 

Hier sind die wichtigen Teile dashboard.html

<!DOCTYPE html> 
<html> 
<head> 
<title>My App</title> 
<link rel="stylesheet" type="text/css" href="styles/dashboardstyle.css"> 
<script src="https://www.gstatic.com/firebasejs/3.6.4/firebase.js"></script> 
<body> 
<script type="text/javascript" src="scripts/app.js"></script> 
<script type="text/javascript" src="scripts/dashboard.js"></script> 
</body> 
</html> 

Es wäre sinnvoll für onAuthStateChanged Feuer, zu erkennen, dass der Benutzer nicht angemeldet ist, und umleiten , Recht? Irgendwelche Ideen? Danke allen!

Antwort

1

löste ich dieses Problem durch eine verschachtelte if statement im true Teil der ursprünglichen Erstellung. In dieser neuen if-Anweisung habe ich den Standort des Benutzers überprüft und, wenn sie auf der Anmeldeseite waren, wurden sie mit dem vorhandenen Code umgeleitet. Ich hatte auch else if Klauseln hier, um nach anderen Orten des Benutzers zu suchen. Wenn sie sich beispielsweise auf einer Seite mit dem Namen profile.html befinden und der Benutzer existiert, müsste ich sie nicht umleiten. Dies wurde überprüft mit dem Code

else if(window.location.href == 'http://website.com/profile.html`){ 
/*then do nothing, no need to be redirected because the user exists, as they 
are within a permitted page */ 
    } 

Dies löste mein Problem.

0

Das ist eine sehr gute Frage. Es hängt davon ab, wie Ihre Infrastruktur eingerichtet ist.

Wenn Sie Firebase Echtzeit-Datenbank verwenden, können Sie die Feuerbasis Regeln verwenden, um Zugriff auf Ressourcen zu beschränken und einen onAuthStateChanged Zuhörer auf jeder Seite zu benutzen und leiten sich anmelden, wenn der Benutzer nicht angemeldet ist.

Wenn Wenn Sie Ihr eigenes Backend verwenden, werden Sie bei der Anmeldung Ihren eigenen Session-Cookie speichern. Am einfachsten ist es, das Firebase-ID-Token (getToken) zu speichern. Sie müssen dies jede Stunde aktualisieren (getToken (true)), da das Token stündlich abläuft und Ihren Sitzungscookie aktualisieren. In Ihrem Backend können Sie die admin node.js-Bibliothek verwenden, um das ID-Token vor dem Bedienen einer eingeschränkten Ressource zu überprüfen und zur Anmeldeseite umzuleiten, wenn der Benutzer nicht angemeldet ist. Ich weiß, dies ist irgendwie eine Vereinfachung des Problems, sollte aber führe dich in die richtige Richtung. Das Firebase-Team wurde über dieses Problem informiert und untersucht es.

Verwandte Themen