如何在 Node.js 中维护我的会话?
例如,我想使用 Node.js 将 UserID 存储在 SESSION 中。我怎样才能在 Node.js 中做到这一点?我也可以在 PHP 中使用那个 Node.js SESSION 吗?
我想要 Node.js 中的以下内容:
<?php $_SESSION['user'] = $userId; ?>
如何在 Node.js 中维护我的会话?
例如,我想使用 Node.js 将 UserID 存储在 SESSION 中。我怎样才能在 Node.js 中做到这一点?我也可以在 PHP 中使用那个 Node.js SESSION 吗?
我想要 Node.js 中的以下内容:
<?php $_SESSION['user'] = $userId; ?>
npm install express-session --save
var express = require('express');
var session = require('express-session');
var app = express();
app.use(session({secret: 'ssshhhhh', saveUninitialized: true, resave: true}));
sess = req.session;
var user_id = 1;
sess.user_id = user_id;
sess = req.session;
sess.user_id
让我把你的问题分成两部分。
ExpressJS 有官方的会话中间件,也是目前 Node.js 的事实标准 Web 框架。
如果您希望自己实现会话支持,则通常在每次请求时执行以下操作:
您还必须实现一些超时机制,以便在一段时间后删除会话对象,至少从内存中删除。
您可以使用express-session中间件。
将它与connect-redis或connect-mongo结合起来,将您的会话存储在数据库中,如果内存对您很有价值(例如在云设置中),则可以节省内存。
快速会话(npm)
如果您将它存储在 MongoDB 中,请使用 PHP MongoDB 驱动程序从那里获取它。
授予访问/权限以查看用户区域的会话,以及它的凭据,因此我们可以在应用程序上使用它。
我使用jsonwebtoken制作了一个令牌,该令牌将在用户成功登录尝试后随着时间的推移包含用户的详细信息。我将它存储在Redis中,它可以用于预先声明的时间限制。
你不需要自己做。Node.js 中有一些很棒的模块可以为您处理这类事情。
如前所述,您可以使用 Express.js 中的会话中间件。
但是,我建议您使用Passport.js。该模块为您完成身份验证部分,有很多策略可以集成到您的网站中(使用 Facebook、Google、Twitter 等登录),并自动处理所有会话内容,在您需要时使用serializeUser()
和运行deserializeUser()
至。
您可以在此处的“会话”部分中查看此内容:配置 Passport.js
您可以通过使用 Node.js 中的“express-session”包在 Node.js 中使用会话。
您必须在应用程序中安装express和express-session :
const express = require('express');
const session = require('express-session');
const app = express();
“秘密”用于cookie,我们必须添加一些秘密来管理会话。我们使用“请求”作为请求变量,就像我们在 PHP 中使用 $_SESSION 一样。
var sess;
app.get('/',function(req,res){ // Get request from the app side
sess = req.session;
sess.email; // Equivalent to $_SESSION['email'] in PHP.
sess.username; // Equivalent to $_SESSION['username'] in PHP.
});
如果您想详细了解 Node.js 中的会话,这里是Code for Geek中关于 Node.js 中会话的完整文档。
在 Node.js 中存储会话相当容易,但您需要了解其步骤,您可以手动处理,也可以使用一些 NPM 模块。Passport 可以帮助您进行身份验证、登录和存储会话,我建议您阅读它的文档,Passport 允许您使用其他不同平台(如 Google、github 等等)对用户进行身份验证。
如果您要使用护照,请使用以下 NPM 模块
2 - 在您的主 app.js 中导入这些模块:
const flash = require('express-flash')
const session = require('express-session')
const passport = require('passport')
app.use(session({
secret:'secret',
resave:false,
saveUninitialized:false
}))
app.use(flash())
app.use(passport.initialize())
app.use(passport.session())
3- 创建passport.js文件。你可以命名任何东西。因此,这背后的基本理解是,您必须检查来自输入表单的有效用户,并且您必须将电子邮件 ID 与您的模型进行比较。如果有效,请检查密码,然后返回用户。完成后,序列化和反序列化您的用户数据以存储在会话中。
我建议检查文档中的这部分以获得更清晰的理解:概述
const localStrategy = require('passport-local').Strategy
const bycrypt = require('bcrypt')
const User = require('../model/User')
const initalize = function(passport) {
const auth = async(email, password, done) => {
try {
const user = await User.findOne({email:email})
if(!user) {
throw new Error("Incorrect Email ..!")
}
const match = await bycrypt.compare(password, user.password)
if(!match) {
throw new Error('Incorrect Password..!')
}
return done(null, user)
}
catch (error) {
console.log(error)
done(null,false,error)
}
}
passport.use(new localStrategy({usernameField:'email'}, auth))
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
}
module.exports = initalize
4 - 现在转到您的登录路由器并使用以下代码
const passport = require('passport')
require('../passport/passport')(passport)
routes.get('/signin', (req,res) => {
res.render('signin', {
pageTitle: 'sign in'
})
})
routes.post('/signin', passport.authenticate('local', {
successRedirect: '/welcome',
failureRedirect: '/',
failureFlash: true
}))
请按照以下步骤操作:
npm install express-session --save
编写以下代码:
var express = require('express');
var session = require('express-session');
var app = express();
app.use(session({secret: 'your secret key', saveUninitialized: true, resave: true}));
var userId = 1234;
app.get('/', function (req, res, next) {
req.session.userId = userId;
});
维护会话现在较旧,您应该尝试使用JWT token。这是非常有效和容易的。但仍然要在 Node.js 中维护会话:
在您的 Express.js 配置中:
var cookieParser = require('cookie-parser');
var session = require('express-session');
app.use(cookieParser());
app.use(session({
secret: 'secret',
resave: true,
saveUninitialized: true,
rolling: true,
cookie: {
path: '/',
maxAge: 60000 * 1000
},
name: 'SID'
}));
登录后存储会话:
var session = req.session;
if (user) {
session.user = user._id;
session.save();
console.log(session);
}
从中间件检查会话:
var session = req.session;
if (session.user) {
req.userid = session.user;
next();
} else {
return res.status(401).send({
code: 401,
message: Constant.authentication_fails
});
}