网络编程
位置:首页>> 网络编程>> JavaScript>> Express实现Session身份认证的示例代码

Express实现Session身份认证的示例代码

作者:两个月亮  发布时间:2024-05-08 09:38:21 

标签:Express,Session,身份认证

Cookie

HTTP

HTTP(Hyper Text Transfer Protocol,超文本传输模式)属于无状态协议,在同一个连接中,两个执行成功的请求之间是没有关系的。这就带来了一个问题,用户没有办法在同一个网站中进行连续的交互。例如:
在一个电商网站里,用户把某个商品加入到购物车,切换一个页面后再次添加了商品,这两次添加商品的请求之间没有关联,浏览器无法知道用户最终选择了哪些商品。而使用 HTTP 的标头(请求头及响应头)扩展,HTTP Cookie 就可以解决这个问题。把 Cookie 添加到标头中,创建一个会话让每次请求都能共享相同的上下文信息,达成相同的状态。

Cookie

Cookie 是一段不超过 4KB 的小型文本数据,由一个名称(Name)以及其对应的值(Value)和其它几个用于控制 Cookie 有效期、安全性、使用范围的可选属性组成。

服务器端
如果一个客户是首次登录该网页的,那么在本次登录成功后,服务器端将向客户端发送一个 Cookie ,其中保存了用户的登录信息。

客户端
Cookie 保存了你的登录信息,浏览器会通过域名来划分浏览器中所有的 Cookie。在你访问一个网页时,浏览器会首先查看浏览器中是否存储了与该域名相关的 Cookie。如果存在,则在向该域名发起请求时将携带与该域名相关的所有的未过期 Cookie。

Session

Session 是基于 Cookie 的,但服务器生成的 Cookie 是一段无意义的字符串(称为 SessionID)。在访问网页时你将发送与该网页相关的 Cookie,即 SessionID。服务器端接收到该数据后将在服务器中查询与该 SessionID 相关的 Session 对象并通过该对象中存储的用户信息来决定对该客户端的行为。

Session VS Cookie

  • Session 将用户信息存储在服务器端,而 Cookie 将用户信息存储在客户端。因此,Cookie 不适合用于保存重要的数据。

  • Session 将用户数据保存在服务器端,这会导致服务器端的工作量增大。

  • 攻击者可以通过分析 Cookie 中的数据来进行 Cookie 欺骗。而使用 Session 进行身份认证时,用户的相关信息保存在服务器中,因此不用担心会被欺骗。

Express 实现 Session 身份认证

获取

在 Express 中,如果你希望使用 Session 进行身份认证,你可以通过第三方中间件 express-session 来实现。如果你使用的是 npm(NodeJS Package Manager) 包管理器,那么你可以通过如下命令来下载并安装第三方中间件:

npm install express-session

配置

// 导入第三方提供的 express-session 中间件
const session = require('express-session');

// 配置 express-session 中间件
app.use(session({
    secret: 'RedHeart',
    resave: false,
    saveUninitialized: true
}))

其中:

  • app.use() 函数用于将中间件注册为全局中间件。对于客户端发送到服务器端的任意类型的请求,如果该请求中没有包含 Cookie,服务器端将向该客户端发送 Cookie 。

  • 对于传递给中间件函数 session() 的参数对象,有:

项目描述
secret用于为生成的 SessionID 进行签名。
name用于设置发送到客户端的 Cookie 的名称。

对于 resave: false 及 saveUninitialized: true 的作用 还没有搞清楚,但网上的相关资料均推荐这样设置。

登录

const express = require('express');
// 导入第三方提供的 express-session 中间件
const session = require('express-session');

const app = express();
// 监听本机 9090 端口
app.listen(9090);

// 配置 express-session 中间件
app.use(session({
    secret: 'RedHeart',
    resave: false,
    saveUninitialized: true
}))

// 设置登录页面的路由
app.get('/login', (req, res) => {
    // 判断 GET 请求中的查询字符串中的参数的值是否符合要求
    if(req.query.username === 'redheart' && req.query.password === 'twomoons'){
        // 将用户信息添加至 Session 中
        req.session.user = req.query;
        // 标记当前用户目前处于登录状态
        req.session.isLogin = true;
        res.send('{ WIN }')
    }else{
        res.send('{ LOSE }');
    }
})

执行效果

在执行上述代码后,你可以通过访问 http://127.0.0.1:9090/login/?username=redheart&password=twomoons 来进行登录。尝试登录后,若页面中显现字符串 { WIN } ,表明该用户已经登录成功。

主页

向前一个示例中添加如下代码:

// 设置主页路由
app.get('/home', (req, res) => {
   // 判断客户端的 Session 状态是否为 true
   // 如果服务器端还未为该客户端分配 SessionID
   // 则 req.session.isLogin 为 undefined 。
   if(req.session.isLogin){
       res.send('{ WIN }');
   }else{
       res.send('{ LOSE }');
   }
})

执行效果

在通过访问 http://127.0.0.1:9090/login/?username=redheart&password=twomoons 登录成功后,访问 http://127.0.0.1:9090/home 你将于页面中观察到字符串 { WIN }。你可以尝试刷新该页面,你会发现显示的字符串并没有变成 { LOSE },这说明服务器端已经通过 SessionID 记住了你。

退出登录

你可以通过调用 req.session.destroy() 来清除 当前 客户端保存在服务器端的 Session 数据。SessionID 仍保存在客户端浏览器中,但已经失效。

app.get('/logout', (req, res) => {
   req.session.destroy();
   res.send('{ WIN }');
})

代码总汇

const express = require('express');
// 导入第三方提供的 express-session 中间件
const session = require('express-session');

const app = express();
// 监听本机 9090 端口
app.listen(9090);

// 配置 express-session 中间件
app.use(session({
    secret: 'RedHeart',
    resave: false,
    saveUninitialized: true
}))

// 设置主页路由
app.get('/home', (req, res) => {
    // 判断客户端的 Session 状态是否为 true
    // 如果服务器端还未为该客户端分配 SessionID
    // 则 req.session.isLogin 为 undefined 。
    if(req.session.isLogin){
        res.send('{ WIN }');
    }else{
        res.send('{ LOSE }');
    }
})

// 设置登录页面的路由
app.get('/login', (req, res) => {
    // 判断 GET 请求中的查询字符串中的参数的值是否符合要求
    if(req.query.username === 'redheart' && req.query.password === 'twomoons'){
        // 将用户信息添加至 Session 中
        req.session.user = req.query;
        // 标记当前用户目前处于登录状态
        req.session.isLogin = true;
        res.send('{ WIN }')
    }else{
        res.send('{ LOSE }');
    }
})

app.get('/logout', (req, res) => {
    req.session.destroy();
    res.send('{ WIN }');
})

来源:https://blog.csdn.net/qq_44879989/article/details/128781320

0
投稿

猜你喜欢

  • __import__() 函数用于动态加载类和函数 。如果一个模块经常变化就可以使用 __import__() 来动态载入。语法__impo
  • 如何在ADO服务器端利用好缓存技术?请看下面示例,这是一个用来显示图书分类的例子程序:displayBooks.asp< %
  • 用python2的小伙伴肯定会遇到字符编码的问题。下面对编码问题做个简单的总结,希望对各位有些帮助。 故事零:编码的定义 我们从“SOS“(
  • os包想要使用os包一样要先导入:import osos包下可以直接调用的函数下面介绍一下os包中可以直接调用的函数:例子:例子:例子:注意
  • 一 例子现在,讲述一个真实的故事!故事一定是伴随着赵忠祥老师的声音开始的,雨季就要来临了,又到了动物们 * 的季节了...还记得,之前发生的作
  • 最近写程序需要从文件中读取数据,并把读取的数据转换成向量。查阅资料之后找到了读取csv文件和txt文件两种方式,下面结合自己的实验过程,做简
  • import urllib2import jsonimport stringurl ='http://m.weather.com.c
  • 1. 原理对于DNA序列,一阶马尔科夫链可以理解为当前碱基的类型仅取决于上一位碱基类型。如图1所示,一条序列的开端(由B开始)可能是A、T、
  • 前言:最近在接触利用python来写测试框架,本人也是个刚接触python,所以是个小菜鸟,今天开始,一点点的记录学习中的积累,方便以后的学
  • 学习 Python 使程序员能够专注于解决问题,而不是专注于语法,其丰富的库赋予它完成伟大任务所需的力量。1. IDLE使得在 Python
  • 如何搭建完整的网站架构并设计出一个出色的网站?关于这个问题,我们很难提出一个绝对权威和正确的设计思路,但任何网站的设计都需要遵循一个循序渐进
  • SQL server2000数据库应用非常广泛,一旦出现安全问题,造成的损失往往难以估量!应提前预防,防患于未然。这里,我们主要谈论有关SQ
  • 本文先抓取网络上的表情图像,然后利用百度 AI 识别表情包上的说明文字,并利用表情文字重命名文件,这样当发表情包时,不需要逐个打开查找,直接
  • 前篇我们稍微学习了Python中时间的获取,这次继续学习日期的时区转换,格式化等等。开发中常用的日期操作还有哪些?时区转换显示日期格式化秒数
  • 之前一直傻傻分不清(n,1)和(n,)之间的区别,这里做一下总结,希望度过此文章的小伙伴都能明白。例如如果我们创建一个包含10个整型数的数组
  • 为了让鼠标移到小图上显示大图,我利用鼠标事件新建了一个层来显示大图.当然之前最好得到XY坐标取得当前鼠标的X,Y坐标:function&nb
  • 首先看一下自定义提示框的效果图alert 普通的提示当然可以自定义样式confrim 确认框 支持callback//message 提示的
  • jupyter notebook使用matlab以下方法前提是已经安装了matlab程序,如果没有请安装后再执行以下步骤1.MATALB安装
  •   现在使用Vscode编码的人越来越多,凭借着免费,开源,轻量,跨平台的特点收货了一大批忠实粉丝最近因项目需要开始使用
  • from http://www.devshed.com/c/a/MySQL/Error-Handling-Examples/ Error H
手机版 网络编程 asp之家 www.aspxhome.com