Как использовать сеансы для аутентификации в Node.js

Я пытался создать систему аутентификации с помощью Node.js для небольшого веб-приложения.

До сих пор я сделал маршрут входа:

app.post('/login', async function(req, res) {
    let login = req.body.login;
    let password = req.body.password;

    let userId = await databaseUsers.verifyUser(login, password);

    if(userId != null) {
        req.session.userId = userId;
    }

    res.send(userId != null);
});

Затем я создал защищенный маршрут:

app.get('/homepage', requiresLogin, function(req, res) {
    res.sendFile(__dirname + '/client/homepage.html');
});

И функция, которая проверяет, зарегистрирован ли пользователь:

function requiresLogin(req, res, next) {
    if (req.session.userId) {
        next();
    } 
    else {
        res.send('You must be logged in to view this page.');
    }
}

На стороне клиента я использую только JS с API выборки:

let url = "/login";
let headers = new Headers({
    "Content-Type": "application/json"
});
let init = {    
    method: 'POST',
    headers: headers,
    cache: 'default',
    body: JSON.stringify({'login': user.login, 'password': user.password})
};

let verif = await fetch(url, init);

Теперь, когда я вхожу в систему, сервер сохраняет в сеансе идентификатор пользователя.

Но при попытке добраться до /homepage я получаю сообщение об ошибке «не подключен».

Я мог бы использовать глобальную переменную для хранения сеанса, но тогда многопользовательский режим больше не будет доступен.

Я также думал об использовании файлов cookie, например, когда пользователь успешно входит в систему, сервер отправляет ему файл cookie.

Но как тогда обрабатывать доступ пользователя к страницам?


person Steeven Diard    schedule 27.03.2018    source источник
comment
Вы правильно внедрили экспресс-сессию?   -  person Jonas Wilms    schedule 27.03.2018
comment
const session = require('express-session'); Я использовал эту строчку, если ты это имеешь в виду,   -  person Steeven Diard    schedule 27.03.2018
comment
I also thought using cookies, like when the user successfully logs in, the server sends him a cookie именно это и делает экспресс сессия :)   -  person Jonas Wilms    schedule 27.03.2018
comment
А потом? Вам нужно смонтировать его как промежуточное программное обеспечение ...   -  person Jonas Wilms    schedule 27.03.2018
comment
Итак, текущий код должен отправить файл cookie клиенту, если я прав?   -  person Steeven Diard    schedule 27.03.2018
comment
app.use(session({secret: 'усердно работать' })); Я настроил все таким образом   -  person Steeven Diard    schedule 27.03.2018
comment
И это до других промежуточных программ?   -  person Jonas Wilms    schedule 27.03.2018
comment
Это начало файла моего сервера: /////////////////// // СТАТИЧЕСКИЕ ФАЙЛЫ // ////////////////// / app.use(express.static(path.join(__dirname, 'client/'))); ///////////////// // ПАРСЕР ТЕЛА // ///////////////// app.use(bodyParser.json() ); ///////////// // СЕССИЯ // ///////////// app.use(session({ secret: 'усердно работать', resave: true, saveUninitialized : ЛОЖЬ }));   -  person Steeven Diard    schedule 27.03.2018
comment
Промежуточное программное обеспечение requireLogin находится в конце файла.   -  person Steeven Diard    schedule 27.03.2018
comment
И verif содержит значение успеха?   -  person Jonas Wilms    schedule 27.03.2018
comment
Он возвращает идентификатор mongoDb объекта, который я проверил, не равен нулю   -  person Steeven Diard    schedule 27.03.2018
comment
Мне просто нужно спросить, строки req.session.userID достаточно, чтобы отправить пользователю файл cookie? Если это так, я проверил в браузере, у меня нет новых файлов cookie после входа в систему.   -  person Steeven Diard    schedule 27.03.2018
comment
Да, это. экспресс-сессия автоматически отражает данные в хранилище. Ну ты и сам нашел проблему. fetch по умолчанию не хранит куки :)   -  person Jonas Wilms    schedule 27.03.2018
comment
Привет, это действительно была проблема   -  person Steeven Diard    schedule 27.03.2018