簡體   English   中英

在 Node.js 中維護會話

[英]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

讓我把你的問題分成兩部分。

  1. 如何在 Node.js 中維護我的 SESSIONS?
    答:使用express-session 中間件來維護 SESSIONS
  2. 我也可以在 PHP 中使用 Node.js SESSION 嗎?
    答:是的,您也可以在 PHP 中使用該會話,但請記住,您必須將該會話存儲在數據庫中。

ExpressJS 有官方的 session 中間件,它也是 Node.js 當前事實上的標准 web 框架。


如果您希望自己實現會話支持,這就是在每次請求時通常的實現方式:

  1. 檢查 cookie 是否包含會話 ID
    • 如果不是,則創建一個存儲在內存、文件或數據庫(或這些的組合)中的會話對象,並在響應 cookie 中設置會話 ID 以匹配此對象的標識符。
    • 如果 cookie 確實包含會話 ID,請通過 ID 定位會話對象。
  2. 提供從步驟 1 獲得/創建的對象作為請求的持久會話對象。

您還必須實現一些超時機制,以便在一段時間后至少從內存中刪除會話對象。

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

將它與connect-redisconnect-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
                });
            }

請按照以下步驟操作:

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

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

您可以通過使用 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 中會話的完整文檔。

您可以通過兩種方式處理會話。

  1. 使用快速會話
  2. 使用JWT Web 令牌並處理您自己的會話(基於令牌的會話處理)。

我認為基於令牌的會話處理比使用express-session更重要。 當您擴展服務器時會遇到問題,並且在某些單設備登錄情況下也會出現問題。

為了檢查我有一個基於令牌的會話處理Node.js 文件夾結構。 您可以檢查一下,它可能會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM