[英]Maintain sessions in Node.js
如何在 Node.js 中維護我的 SESSIONS?
例如,我想使用 Node.js 在 SESSION 中存儲 UserID。 我怎樣才能在 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 有官方的 session 中間件,它也是 Node.js 當前事實上的標准 web 框架。
如果您希望自己實現會話支持,這就是在每次請求時通常的實現方式:
您還必須實現一些超時機制,以便在一段時間后至少從內存中刪除會話對象。
您可以使用express-session中間件。
將它與connect-redis或connect-mongo 結合以將您的會話存儲在數據庫中,並在內存對您有價值的情況下節省內存(例如在雲設置中)。
快速會話(npm)
如果您將它存儲在 MongoDB 中,請使用 PHP MongoDB 驅動程序從那里獲取它。
你不需要自己做。 Node.js 中有一些很棒的模塊可以為您處理此類事情。
如前所述,您可以使用 Express.js 中的會話中間件。
但是,我建議您使用Passport.js 。 該模塊為您完成身份驗證部分,有很多策略可以集成到您的網站中(使用 Facebook、Google、Twitter 等登錄),並使用serializeUser()
和deserializeUser()
自動處理所有會話內容deserializeUser()
可隨時調用。
您可以在“會話”部分中查看此處:配置 Passport.js
提供訪問/許可以查看用戶區域的會話,以及它的憑據,因此我們可以在應用程序上使用它。
我使用jsonwebtoken制作了一個令牌,在用戶成功登錄嘗試后,該令牌將隨時間具有用戶的詳細信息。 我將它存儲在Redis 中,它可以用於預先聲明的時間限制。
維護會話現在較舊,您應該嘗試使用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
});
}
請按照以下步驟操作:
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; });
在 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
}))
您可以通過使用 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 中會話的完整文檔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.