Как реализовать сессию с экспресс-сессией? - PullRequest
0 голосов
/ 06 июля 2018

Я рассматриваю возможность использования сессии в моем приложении node.js.

Я понимаю следующее: - cookie-файл сеанса использует cookie-файл для сохранения данных сеанса на стороне клиента. - cookie-файл экспресс-сеанса используется для хранения идентификатора сеанса, а все данные сеанса хранятся на стороне сервера

Я беспокоюсь о безопасности, поэтому я бы выбрал экспресс-сессию. Но в документации сказано, что по умолчанию экспресс-сеанс хранит данные в памяти, а это не предусмотрено в производстве.

Итак, мои вопросы: Как вы реализуете сессию в вашем приложении? Хранилища сессий не влияют на производительность? Если нет, какой магазин сессий вы бы мне порекомендовали? (мое приложение использует MySql в качестве базы данных)

Большое спасибо за вашу помощь. С уважением.

1 Ответ

0 голосов
/ 06 июля 2018

Самый простой способ управления данными сеанса - токены.

Вы можете легко использовать «паспорт» для expressjs и nodejs.

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

Они передаются в заголовок «авторизация» как веб-стандарт.

Вот пример проверки, которую я использую для извлечения и проверки сгенерированного токена, предоставленного пользователем.

module.exports.ensureAuthorized = function ensureAuthorized(req, res) {
    return new Promise((resolve) => {
        let bearerToken;
        let bearerHeader = req.headers["authorization"];
        if (typeof bearerHeader !== 'undefined') {
            let bearer = bearerHeader.split(" ");
            bearerToken = bearer[1];
            req.token = bearerToken;
            this.userPayload(req.token).then((result) => {
                if (!result) {
                    return res.status(403).json({message:"Failed to verify token supplied in authorization header", data: null});
                }else{
                    resolve(result);
                }
            });
        } else {
            return res.status(403).json({message:"Failed to supply token in authorization header.", data: null});
        }
    });
};

А вот мой вызов REST API для пользователя, пытающегося войти в систему: (который генерирует действительный токен)

let jwt = require('jsonwebtoken');
let config = require('../../misc/config');
global.atob = require("atob");
let mongoose = require('mongoose');

exports.getLogin = function(req, res) {
    const btoaAuth = (req.headers.authorization || '').split(' ')[1] || '';
    const [username, password, rememberMe] = atob(btoaAuth).toString().split(':');
    if(username && password) {
        usersModel.findOneAndUpdate({username: username},{lastLogin: new Date(),})
            .exec(function (err, userResult) {
                if(err) return res.status(500).json({message: "Server failed search users", data: err});
                if(!userResult) return res.status(500).json({message: "Username invalid", data: err});
                userResult.verifyPassword(password, function(err, isMatch) {
                    if (err) {  return res.status(500).json({message: "Server failed to process user login", data: err});}

                    // Password did not match
                    if (!isMatch) {  return res.status(403).json({message: "Password incorrect", data: err}); }
                    // Success
                    let token = jwt.sign({_id: userResult._id,username: userResult.username, exp: rememberMe === 'true'? Math.floor(Date.now() / 1000) + (60 * 60 * 24 * 365 * 100) : Math.floor(Date.now() / 1000) + (60 * 60) }, config.jwtSecret);
                    let obj = {};
                    obj['profile'] = userResult;
                    obj['profile']['password'] = undefined;
                    obj['token'] = token;
                    return res.status(200).json({message: "Successful login", data: obj});
                });
            });
    }else{
        return res.status(400).json({message: "Username and password are required", data: req.body});
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...