Как узнать, вошел ли пользователь в систему с помощью password.js?


104

Я читал passport.jsинформацию и образцы в течение двух дней, но после этого не уверен, что проделал весь процесс аутентификации.

Как мне узнать, вошел ли я в систему, например, у меня будет панель навигации с кнопкой входа или выхода, есть ли какая-то переменная, такая как код ниже?

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

Ответы:


210

Если пользователь вошел в систему, passport.jsбудет создавать userобъект reqдля каждого запроса express.js, который вы можете проверить на наличие в любом промежуточном программном обеспечении:

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

Вы можете создать express.jsдля этого простое промежуточное ПО, которое будет проверять, вошел ли пользователь в систему, а если нет - перенаправит на /loginстраницу:

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

И используйте это:

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

Это глобально? Могу ли я получить к нему доступ во всех проектах после входа в систему?
RMontes13

3
это не глобально, это просто для объекта запроса.
supernova

1
В 98,8% веб-разработки с помощью express.js и Passport.js вы будете иметь дело с запросами (app.get, app.post и т. Д.), Поэтому говорить об использовании паспортного файла за его пределами немного бессмысленно. Да, это только в обработчиках промежуточного программного обеспечения экспресс-маршрутов, например app.get, app.postи т. Д. Если вам нужна другая функциональность, вы должны подробно объяснить это в своем вопросе, а также то, что вы пытаетесь достичь.
moka

2
Я обнаружил, что если я не предоставлю router.get () какое-либо промежуточное программное обеспечение для проверки аутентификации, как в «router.get ('/', my_controller.index)», то паспорт никогда не запрашивается и req.user всегда будет быть неопределенным. Это расстраивает, потому что я хочу разрешить любому посетителю вызывать API, но приспосабливать содержание ответа в зависимости от того, кто запрашивает.
Лоуренс И. Сиден

2
Может кто-нибудь объяснить, как это нельзя использовать? Эта проверка просто проверяет, является ли их объект пользователя в запросе. Где проверка сеанса?
rambossa 07

46

Если вы хотите использовать его в своих шаблонах, поскольку ваш образец кода, похоже, указывает на то, что вы можете создать промежуточное ПО, такое как это:

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

Поместите этот код где-нибудь после настройки паспорта.

А затем используйте его в своем шаблоне (пример swig)

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

По какой-то причине вышеупомянутое промежуточное ПО вызывало у меня проблему с неопределенным пользователем в моем шаблоне. Мне пришлось повторно предоставить пользовательский объект для представления, чтобы исправить это следующим образом: app.use(function(req,res,next){ res.locals.login = req.isAuthenticated(); res.locals.user = req.user; next(); });
Tebbers,

1
Даже после успешной аутентификации isAuthenticatedв следующем запросе выдает false. Не могли бы вы помочь ответить на этот вопрос stackoverflow.com/questions/42842171/…
Сухаил Гупта

3

Он явно не документирован , но есть isAuthenticated()метод , который вставляется reqпо паспорту .
Может использоваться следующим образом:

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

Я искал такое решение и наткнулся на эту страницу. Вопрос в том, как проверить статус входа на стороне клиента.

После входа я скрываю кнопку входа и показываю кнопку выхода. При обновлении страницы я снова вижу кнопку входа в систему вместо кнопки выхода. Единственное решение - сохранить элемент в sessionStorage, если вы используете session (и localStorage, если вы используете JWT). Удалите этот элемент при выходе из системы. Затем при каждой загрузке страницы проверяйте этот элемент sessionStorage и действуйте соответственно.

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 () или router.get ()

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

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

0

Хороший вопрос, у меня были некоторые проблемы при попытке реализовать что-то вроде этого, когда есть неаутентифицированный запрос, handlebars пропускает блок if, если переменная res.locals возвращает ложное значение. Чтобы решить эту проблему, вам необходимо настроить промежуточное ПО в файле app.js, чтобы сделать req.user доступным глобально в вашем приложении. Вот так ..

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

});

В файле заголовка вы можете выполнить эту проверку для аутентифицированного пользователя и отобразить соответствующий контент следующим образом ..

                {{#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}} 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.