gpt4 book ai didi

mysql - 如何用express-session实现session?

转载 作者:行者123 更新时间:2023-11-30 21:41:48 24 4
gpt4 key购买 nike

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

我了解以下内容:- session-cookie 使用 cookie 在客户端保存 session 数据- express-session 使用cookie 来存储一个sessionID,所有的session 数据都存储在服务器端

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

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

非常感谢您的帮助。问候。

最佳答案

我发现管理 session 数据的最简单方法是 token 。

您可以轻松地为 expressjs 和 nodejs 使用“通行证”。

您可以生成一个 token ,该 token 在您的 NodeJS 后端使用私钥签名并可通过公钥识别。这些 token 甚至可以被撤销。

它们作为网络标准传递到“授权” header 中。

这是我用来提取和检查用户提供的生成 token 的验证示例。

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 调用:(生成有效 token )

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});
}
};

关于mysql - 如何用express-session实现session?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51200338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com