Як дізнатися, чи користувач увійшов через passport.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
це не глобально його просто на об'єкт запиту.
супернова

1
У 98,8% веб-розробок з express.js та passport.js ви будете мати справу із запитами (app.get, app.post тощо), тому говорити про використання passport.js поза нею зовсім безглуздо. Так, це стосується лише експрес-обробників проміжних програм, наприклад app.get, app.postтощо. Якщо вам потрібна інша функціональність, то вам слід детально пояснити це у вашому запитанні, а також те, що ви намагаєтеся досягти.
moka

2
Я виявив, що якщо я не надаю router.get () будь-яке проміжне програмне забезпечення для перевірки автентичності, як у "router.get ('/', my_controller.index)", то з паспортом ніколи не звертаються, і req.user завжди бути невизначеним Це засмучує те, що я хочу дозволити будь-якому відвідувачу зателефонувати в API, але налаштувати вміст відповіді залежно від того, хто звертається із запитом.
Лоуренс І. Сіден

2
Чи може хтось пояснити, як це не вигідно? Ця перевірка просто виглядає, щоб побачити, чи є їх об’єктом користувача у запиті. Де перевірка сеансу?
rambossa

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

Навіть після успішної автентифікації isAuthenticatedнадає помилку в наступному запиті. Чи можете ви допомогти відповісти на це питання stackoverflow.com/questions/42842171/…
Suhail Gupta

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, якщо ви використовуєте сеанс (і localStorage, якщо ви використовуєте JWT). Видаліть цей елемент під час виходу. Потім у кожному завантаженні сторінки перевірте цей елемент сеансу зберігання та зробіть відповідно.

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

Добре запитання, у мене виникли деякі проблеми, намагаючись реалізувати щось подібне, коли є неавторизований запит, рульова панель пропускає блок 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.