在Node.js中维护会话

14

我该如何在Node.js中维护我的SESSION?

例如,我想使用Node.js将UserID存储在SESSION中。我该如何在Node.js中实现这一点?同时,我是否可以在PHP中使用Node.js的SESSION?

我希望在Node.js中实现以下内容:

<?php $_SESSION['user'] = $userId; ?>

相关:*Node.js中的会话Node.js会话*。 - Peter Mortensen
11个回答

16

首先安装session包

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

9

让我把你的问题分成两部分。

  1. 如何在Node.js中维护SESSIONS?
    答案:使用express-session中间件来维护SESSIONS。
  2. 我能在PHP中使用Node.js SESSION吗?
    答案:是的,你可以在PHP中使用该会话,但请记住,你必须将该会话存储在数据库中。

8

ExpressJS拥有官方的会话中间件,是当前Node.js的事实标准Web框架。


如果您希望自己实现会话支持,每个请求通常需要进行以下操作:

  1. 检查Cookie是否包含会话ID
    • 如果没有,创建一个会话对象,该对象存储在内存中、文件中或数据库中(或这些的组合),并将会话ID设置为响应Cookie以匹配此对象的标识符。
    • 如果Cookie包含会话ID,则根据ID定位会话对象。
  2. 将步骤1获取/创建的对象作为请求的持久化会话对象提供。

您还需要实现一些超时机制,以便在一段时间后删除会话对象,至少从内存中删除。


3
您可以使用 express-session 中间件来实现。结合 connect-redisconnect-mongo 来将会话存储在数据库中,如果内存对您很重要(比如在云设置中),则可以节省内存。express-sessions (npm)。如果您将其存储在 MongoDB 中,则使用 PHP MongoDB 驱动程序从中提取它。请保留 HTML 标记。

1
你不需要亲自操作,因为在Node.js中有一些出色的模块可以为您处理此类事情。您可以使用Express.js的会话中间件,正如之前建议的那样。然而,我建议您使用Passport.js。该模块为您处理身份验证部分,在您的网站中整合了许多策略(使用Facebook、Google、Twitter等进行登录),并自动处理所有会话内容,使用serializeUser()deserializeUser()函数。您可以在这里查看,位于“Sessions”部分:配置Passport.js

1

会话提供了访问/查看用户区域的权限,同时也是一种凭证,因此我们可以在应用程序中使用它。

我使用了jsonwebtoken制作了一个令牌,在用户成功登录尝试后,该令牌将包含用户的详细信息和时间。我将其存储在Redis中,并且可以在预先声明的时间限制内使用。


0

在Node.js中,您可以使用“express-session”包来使用会话。

您需要在应用程序中安装expressexpress-session

const express = require('express');
const session = require('express-session');
const app = express();

“secret”用于cookie,我们必须添加一些秘密来管理会话。 “request”作为请求变量使用,就像在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中查看完整文档。


0
保持会话现在已经过时,您应该尝试使用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
                });
            }

0
在Node.js中存储会话非常简单,但您需要了解其步骤,您可以手动处理这个问题,也可以使用一些NPM模块。Passport可以帮助您进行身份验证、登录和存储会话,我建议您阅读它的文档。Passport允许您使用不同的平台(如Google、GitHub等)对用户进行身份验证。
如果您打算使用Passport,请使用以下NPM模块:
1. Passport 2. Passport Local 3. Express-flash 4. Express-session
在您的主要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
    }))

0

请按照以下步骤操作:

  1. npm install express-session --save

  2. 编写以下代码:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接