[英]How to implement session with express-session?
我正在考慮在node.js應用程序中使用會話。
我了解以下內容:-會話cookie使用cookie來在客戶端保存會話數據-快速會話使用cookie來存儲sessionID,並且所有會話數據都存儲在服務器端
我擔心安全性,因此我會選擇快速會話。 但是文檔說默認情況下,快速會話將數據存儲在內存中,這在生產中是不可想象的。
所以我的問題是:如何在應用程序中實現會話? 會話存儲是否不影響性能? 如果沒有,您會推薦我哪個會話存儲? (我的應用程序使用MySql作為數據庫)
非常感謝您的幫助。 問候。
我發現管理會話數據的最簡單方法是令牌。
您可以輕松地對expressjs和nodejs使用“ passport”。
您可以生成一個令牌,該令牌在您的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});
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.