Woher wissen Sie, ob der Benutzer mit passport.js angemeldet ist?

104

Ich habe passport.jszwei Tage lang Informationen und Beispiele gelesen , bin mir aber nicht sicher, ob ich danach den gesamten Prozess der Authentifizierung durchgeführt habe.

Woher weiß ich, ob ich angemeldet bin? Ich habe beispielsweise eine Navigationsleiste mit einer Anmelde- oder Abmeldeschaltfläche. Gibt es unten eine Variable wie Code?

if (login)
   <button>logout</button>
else 
   <button>login</button>
RMontes13
quelle

Antworten:

208

Wenn der Benutzer angemeldet ist, passport.jswird für jede Anforderung ein userObjekt erstellt , das Sie in jeder Middleware auf Existenz prüfen können:reqexpress.js

if (req.user) {
    // logged in
} else {
    // not logged in
}

Sie können dafür eine einfache express.jsMiddleware erstellen , die prüft, ob der Benutzer angemeldet ist, und wenn nicht, zur /loginSeite umleitet :

function loggedIn(req, res, next) {
    if (req.user) {
        next();
    } else {
        res.redirect('/login');
    }
}

Und benutze es:

app.get('/orders', loggedIn, function(req, res, next) {
    // req.user - will exist
    // load user orders and render them
});
Moka
quelle
Es ist global? Kann ich nach dem Login in allen Projekten darauf zugreifen?
RMontes13
3
Es ist nicht global, sondern nur auf dem Anforderungsobjekt.
Supernova
1
In 98,8% der Webentwicklung mit express.js und passport.js werden Sie sich mit Anfragen (app.get, app.post usw.) befassen. Daher ist es ein wenig sinnlos, über die Verwendung von passport.js außerhalb davon zu sprechen. Ja , es ist nur innerhalb Schnellstraße Middleware - Handler mag app.get, app.postusw. Wenn Sie verschiedene Funktionen benötigen, dann sollten Sie es in Einzelheiten in Ihrer Frage erklären , als auch, was Sie erreichen wollen.
Moka
2
Ich habe festgestellt, dass, wenn ich router.get () keine Middleware zur Überprüfung der Authentifizierung zur Verfügung stelle, wie in "router.get ('/', my_controller.index)", der Pass nie konsultiert wird und req.user dies immer tut undefiniert sein. Dies ist frustrierend, da ich jedem Besucher erlauben möchte, eine API aufzurufen, aber den Inhalt der Antwort je nach Anforderung anpassen kann.
Lawrence I. Siden
2
Kann jemand erklären, wie dies nicht ausnutzbar ist? Bei dieser Überprüfung wird lediglich geprüft, ob es sich bei der Anforderung um ein Benutzerobjekt handelt. Wo ist die Sitzungsvalidierung?
Rambossa
46

Wenn Sie es in Ihren Vorlagen verwenden möchten, da Ihr Codebeispiel darauf hinweist, dass Sie Middleware wie diese erstellen können:

app.use(function (req, res, next) {
  res.locals.login = req.isAuthenticated();
  next();
});

Platzieren Sie diesen Code irgendwo, nachdem Sie den Pass eingerichtet haben.

Und dann verwenden Sie es in Ihrer Vorlage (swig Beispiel)

{% if login %}
<button>logout</button>
{% else %} 
<button>login</button>
{% endif %}
Cyberwombat
quelle
Aus irgendeinem Grund gab mir die oben genannte Middleware ein Problem damit, dass der Benutzer in meiner Vorlage nicht definiert war. Ich musste das Benutzerobjekt erneut für die Ansicht app.use(function(req,res,next){ res.locals.login = req.isAuthenticated(); res.locals.user = req.user; next(); });
bereitstellen
Gibt auch nach erfolgreicher Authentifizierung isAuthenticatedbei der nächsten Anfrage false aus. Könnten Sie helfen, diese Frage zu beantworten stackoverflow.com/questions/42842171/…
Suhail Gupta
2

Ich habe nach einer solchen Lösung gesucht und bin auf diese Seite gestoßen. Die Frage ist, wie der Anmeldestatus auf der Clientseite überprüft werden kann.

Nach dem Anmelden verstecke ich die Schaltfläche Anmelden und zeige die Schaltfläche Abmelden. Bei der Seitenaktualisierung wird erneut die Anmeldeschaltfläche anstelle der Abmeldeschaltfläche angezeigt. Die einzige Lösung besteht darin, ein Element in sessionStorage zu speichern, wenn Sie session verwenden (und localStorage, wenn Sie JWT verwenden). Löschen Sie dieses Element, wenn Sie sich abmelden. Überprüfen Sie dann bei jedem Laden der Seite dieses sessionStorage-Element und führen Sie es entsprechend aus.

if (sessionStorage.getItem('status')) {
    $("#btnlogout").show();
    $("#btnlogin").hide();
// or what ever you want to do
} else {
    $("#btnlogout").hide();
    $("#btnlogin").show();
}



function Login() {
            var data = {
                username: $("#myModal #usr").val(),
                password: $("#myModal #pw").val()

            };
            $.ajax({
                type: 'POST',
                url: '/login',
                contentType: 'application/JSON; charset=utf-8',
                data: JSON.stringify(data),
                success: funcSuccess,
                error: funcFail
            });
            function funcSuccess(res) {
                sessionStorage.setItem('status', 'loggedIn');

                $("#btnlogout").show();
                $("#btnlogin").hide();
            }
            function funcFail() { $("#pp").text('Login Failed'); };
        };

function Logout() {
    $.ajax({
        type: 'GET',
        url: '/logout',
        contentType: 'application/JSON; charset=utf-8',
        success: funcSuccess,
        error: funcFail,
    });
    function funcSuccess(res) {
        $("#btnlogout").hide();
        $("#btnlogin").show();
        sessionStorage.removeItem("status");
    };
    function funcFail() { alert('Login method Failed'); };
}; 
Zeni
quelle
2

Verwenden Sie den folgenden Code in app.get () oder router.get ()

router.get('/edit/:id', (req, res)=>{
  if(req.isAuthenticated()){
     if(req.isAuthenticated()){
      //

      }
  else{
   res.redirect('/users/login');//your particular login routes
     }
});
Pankaj
quelle
2

Es ist nicht explizit dokumentiert, aber es gibt eine isAuthenticated()Methode, die reqper Pass eingefügt wird .
Kann wie folgt verwendet werden:

req.isAuthenticated() // returns true if auth, false if not

// auth.js
module.exports = {
  ensureAuthenticated: (req, res, next) => {
    if (req.isAuthenticated()) {
      return next()
    }
    res.redirect('/login') // if not auth
  },

  forwardAuthenticated: (req, res, next) => {
    if (!req.isAuthenticated()) {
      return next()
    }
    res.redirect('/dashboard');  // if auth    
  }
}

// app.js
app.get('/dashboard', ensureAuthenticated, (req, res) => res.render('dashboard'))
app.get('/login', forwardAuthenticated, (req, res) => res.render('login'))
app.get('/register', forwardAuthenticated, (req, res) => res.render('register'))
Hasan Sefa Ozalp
quelle
0

Gute Frage, ich hatte einige Probleme beim Versuch, so etwas zu implementieren. Wenn eine nicht authentifizierte Anforderung vorliegt, überspringt der Lenker den if-Block, wenn die Variable res.locals einen falschen Wert zurückgibt. Um dieses Problem zu lösen, müssen Sie eine Middleware in Ihrer app.js-Datei einrichten, um den req.user global in Ihrer App verfügbar zu machen.

app.use(function (req, res, next) {
res.locals.login = req.user;
next();

});

In Ihrer Header-Datei können Sie diese Prüfung für authentifizierte Benutzer durchführen und entsprechende Inhalte wie folgt anzeigen.

                {{#if login }}
                    <li><a href="#">User Account</a></li>
                    <li role="separator" class="divider"></li>
                    <li><a href="#">Logout</a></li>
                {{/if}}
                {{#unless login}}
                    <li><a href="#">Sign up</a></li>
                    <li><a href="#">Sign in</a></li>
                {{/unless}} 
Camillus Chinaedu Teteh
quelle