Kullanıcının passport.js ile oturum açıp açmadığını nasıl anlarım?


104

passport.jsİki gündür bilgi ve örnekler okuyorum , ancak ondan sonra tüm kimlik doğrulama sürecini yaptığımdan emin değilim.

Giriş yapıp yapmadığımı nasıl anlarım, örneğin, giriş veya çıkış düğmesi olan bir gezinme çubuğum olacak, aşağıdaki kod gibi bazı değişkenler var mı?

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

Yanıtlar:


210

Kullanıcı oturum açtıysa, her istek için herhangi bir ara yazılımda var olup olmadığını kontrol edebileceğiniz nesne girişi passport.jsoluşturur :userreqexpress.js

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

Bunun express.jsiçin, kullanıcının oturum açıp açmadığını kontrol edecek ve değilse - /loginsayfaya yönlendirecek basit bir ara yazılım oluşturabilirsiniz :

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

Ve onu kullanın:

app.get('/orders', loggedIn, function(req, res, next) {
    // req.user - will exist
    // load user orders and render them
});

Küresel mi? Giriş yaptıktan sonra tüm projelerde ona erişebilir miyim?
RMontes13

3
küresel değil, sadece istek nesnesinde.
süpernova

1
Express.js ve passport.js ile web geliştirmenin% 98,8'inde isteklerle (app.get, app.post, vb.) İlgileneceksiniz, bu nedenle passport.js'yi bunun dışında kullanmaktan bahsetmek biraz anlamsız. Evet, sadece app.get, app.postvb. Gibi ekspres yol ara yazılımı işleyicileri dahilindedir . Farklı işlevlere ihtiyacınız varsa, bunu, ne elde etmeye çalıştığınızın yanı sıra sorunuzda ayrıntılı olarak açıklamalısınız.
moka

2
"Router.get ('/', my_controller.index)" gibi kimlik doğrulamasını kontrol etmek için router.get () 'a herhangi bir ara yazılım sağlamazsam, pasaporta hiçbir zaman başvurulmadığını ve req.user'ın her zaman olacağını öğrendim. tanımsız olmak. Bu sinir bozucu çünkü herhangi bir ziyaretçinin bir API çağırmasına izin vermek istiyorum, ancak yanıtın içeriğini kimin istediğine bağlı olarak uyarlamak istiyorum.
Lawrence I. Siden

2
Birisi bunun nasıl istismar edilemeyeceğini açıklayabilir mi? Bu kontrol basitçe onların istekte bir kullanıcı nesnesi olup olmadığına bakar. Oturum doğrulama nerede?
rambossa

46

Kod örneğiniz aşağıdaki gibi bazı ara yazılımlar oluşturabileceğinizi gösteriyor gibi göründüğü için bunu şablonlarınızda kullanmak istiyorsanız:

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

Pasaportunuzu ayarladıktan sonra bu kodu bir yere koyun.

Ve sonra bunu şablonunuzda kullanın (swig örneği)

{% if login %}
<button>logout</button>
{% else %} 
<button>login</button>
{% endif %}

Bazı nedenlerden dolayı, yukarıdaki ara yazılım bana, şablonumda tanımsız olan kullanıcı ile ilgili bir sorun veriyordu. Düzeltmek için kullanıcı nesnesini görünüme yeniden sağlamak zorunda kaldım: app.use(function(req,res,next){ res.locals.login = req.isAuthenticated(); res.locals.user = req.user; next(); });
Tebbers

Başarılı bir kimlik doğrulamasından sonra bile bir isAuthenticatedsonraki istekte yanlış verir. Bu soruyu yanıtlamanıza yardımcı olabilir misiniz stackoverflow.com/questions/42842171/…
Suhail Gupta

3

Bu açıkça belgelenmiş değil ancak orada isAuthenticated()yerleştirilir yöntem reqile pasaport .
Aşağıdaki gibi kullanılabilir,

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'))

2

Böyle bir çözüm arıyordum ve bu sayfaya rastladım. Soru, istemci tarafında oturum açma durumunun nasıl kontrol edileceğidir.

Oturum açtıktan sonra Oturum Aç düğmesini gizlerim ve oturum kapatma düğmesini gösteririm. Sayfa yenilemede, çıkış düğmesi yerine tekrar giriş düğmesini görüyorum. Tek çözüm, oturum kullanıyorsanız (ve JWT kullanıyorsanız localStorage) bir öğeyi sessionStorage'a kaydetmektir. Oturumu kapattığınızda bu öğeyi silin. Ardından her sayfa yüklemesinde bu sessionStorage öğesini kontrol edin ve buna göre yapın.

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

2

app.get () veya router.get () içinde aşağıdaki kodu kullanın

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

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

0

Güzel soru, böyle bir şeyi uygulamaya çalışırken bazı sorunlar yaşadım, kimliği doğrulanmamış bir istek olduğunda, res.locals değişkeni yanlış bir değer döndürürse gidon if bloğunu atlar. Bu sorunu çözmek için, req.user'ı uygulamanızda küresel olarak kullanılabilir hale getirmek için app.js dosyanızda bir ara yazılım kurmanız gerekir.

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

});

Başlık dosyanızda, kimliği doğrulanmış kullanıcı için bu kontrolü yapabilir ve buna benzer içeriği görüntüleyebilirsiniz.

                {{#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}} 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.