15

如何在 Node.js 中维护我的会话?

例如,我想使用 Node.js 将 UserID 存储在 SESSION 中。我怎样才能在 Node.js 中做到这一点?我也可以在 PHP 中使用那个 Node.js SESSION 吗?

我想要 Node.js 中的以下内容:

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

11 回答 11

15

首先安装会话包

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
于 2015-12-17T11:30:18.787 回答
9

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

  1. 如何在 Node.js 中维护我的会话?
    答:使用express-session 中间件来维护 SESSIONS
  2. 我也可以在 PHP 中使用 Node.js SESSION 吗?
    答: 是的,您也可以在 PHP 中使用该会话,但请记住您必须将该会话存储在数据库中。
于 2015-02-04T17:57:56.320 回答
8

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


如果您希望自己实现会话支持,则通常在每次请求时执行以下操作:

  1. 检查 cookie 是否包含会话 ID
    • 如果不是,则创建一个存储在内存、文件或数据库(或它们的组合)中的会话对象,并在响应 cookie 中设置会话 ID 以匹配该对象的标识符。
    • 如果 cookie 确实包含会话 ID,则通过 ID 定位会话对象。
  2. 提供从步骤 1 中获取/创建的对象作为请求的持久会话对象。

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

于 2013-11-07T08:07:09.277 回答
3

您可以使用express-session中间件。

将它与connect-redisconnect-mongo结合起来,将您的会话存储在数据库中,如果内存对您很有价值(例如在云设置中),则可以节省内存。

快速会话(npm)

如果您将它存储在 MongoDB 中,请使用 PHP MongoDB 驱动程序从那里获取它。

于 2015-01-26T16:11:45.320 回答
1

授予访问/权限以查看用户区域的会话,以及它的凭据,因此我们可以在应用程序上使用它。

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

于 2019-07-16T11:00:08.657 回答
1

你不需要自己做。Node.js 中有一些很棒的模块可以为您处理这类事情。

如前所述,您可以使用 Express.js 中的会话中间件。

但是,我建议您使用Passport.js。该模块为您完成身份验证部分,有很多策略可以集成到您的网站中(使用 Facebook、Google、Twitter 等登录),并自动处理所有会话内容,在您需要时使用serializeUser()和运行deserializeUser()至。

您可以在此处的“会话”部分中查看此内容:配置 Passport.js

于 2015-12-24T18:33:51.170 回答
0

您可以通过使用 Node.js 中的“express-session”包在 Node.js 中使用会话。

您必须在应用程序中安装expressexpress-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 中会话的完整文档。

于 2021-01-27T05:37:34.073 回答
0

在 Node.js 中存储会话相当容易,但您需要了解其步骤,您可以手动处理,也可以使用一些 NPM 模块。Passport 可以帮助您进行身份验证、登录和存储会话,我建议您阅读它的文档,Passport 允许您使用其他不同平台(如 Google、github 等等)对用户进行身份验证。

如果您要使用护照,请使用以下 NPM 模块

  1. 护照
  2. 本地护照
  3. 快闪
  4. 快速会话

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
    }))
于 2020-01-02T10:09:19.493 回答
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;
    });
    
于 2019-08-13T08:36:02.117 回答
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
                });
            }
于 2017-01-04T06:29:33.037 回答
-1

您可以通过两种方式处理会话。

  1. 使用快速会话
  2. 使用JWT Web 令牌并处理您自己的会话(基于令牌的会话处理)。

我认为基于令牌的会话处理比使用express-session更重要。当您扩展服务器时,您会遇到问题,并且在某些单设备登录情况下也会遇到问题。

为了检查,我有一个基于令牌的会话处理Node.js 文件夹结构。您可以检查它,它可能会有所帮助。

于 2017-03-29T14:57:22.820 回答