首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用express-session实现session?

如何使用express-session实现session?
EN

Stack Overflow用户
提问于 2018-07-06 05:49:49
回答 1查看 796关注 0票数 1

我正在考虑在我的node.js应用程序中使用会话。

我的理解如下:- session-cookie使用cookie在客户端保存会话数据- express-session使用cookie存储一个sessionID,所有的会话数据都存储在服务器端

我担心安全性,所以我选择express-session。但是文档中说,默认情况下,express-session将数据存储在内存中,这在生产中是不可想象的。

所以我的问题是:如何在应用程序中实现会话?会话存储不会影响性能吗?如果没有,你会推荐给我哪个会话存储?(我的应用程序使用MySql作为数据库)

非常感谢你的帮助。致以问候。

EN

回答 1

Stack Overflow用户

发布于 2018-07-06 06:56:33

我发现管理会话数据的最简单的方法是令牌。

你可以很容易地在expressjs和nodejs中使用'passport‘。

您可以生成一个令牌,该令牌在您的NodeJS后台使用私钥签名,并可由公钥标识。这些令牌甚至可以被撤销。

它们被作为web标准传递到“authorization”头中。

下面是我用来提取和检查用户提供的生成的令牌的验证示例。

代码语言:javascript
复制
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调用:(它会生成一个有效的令牌)

代码语言:javascript
复制
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});
    }
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51200338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档