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

 更新时间:2023年01月31日 08:26:47   作者:两个月亮  
本文主要介绍了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 }');
})

到此这篇关于Express实现Session身份认证的示例代码的文章就介绍到这了,更多相关Express Session身份认证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于没有彻底清除node和npm的解决方法

    关于没有彻底清除node和npm的解决方法

    最近因为npm和node的版本不匹配遇到了许多困难,比如更新npm的版本,结果它给报错了,查阅了好多资料,发现就是node和npm卸载的时候,还有残留,所以本文给大家介绍了关于没有彻底清除node和npm的解决方法,需要的朋友可以参考下
    2024-03-03
  • Nodejs如何进行性能监控和分析优化

    Nodejs如何进行性能监控和分析优化

    Node.js应用可能因为高并发、内存泄漏、CPU密集型任务等原因导致性能下降,影响用户体验甚至系统稳定性,通过性能监控和分析,我们可以及时发现潜在问题,并针对性地进行优化,确保系统正常运行且具备良好的性能表现
    2024-06-06
  • nodejs使用express获取get和post传值及session验证的方法

    nodejs使用express获取get和post传值及session验证的方法

    这篇文章主要介绍了nodejs使用express获取get和post传值及session验证的方法,结合实例形式分析了nodejs使用express实现获取get和post传值及session验证功能的具体操作步骤与注意事项,需要的朋友可以参考下
    2017-11-11
  • Node.js接入DeepSeek实现流式对话功能

    Node.js接入DeepSeek实现流式对话功能

    随着人工智能技术的发展,越来越多的服务和应用开始集成AI能力以提升用户体验,本文将介绍如何通过Node.js接入DeepSeek提供的API服务,特别是其聊天完成(Chat Completions)功能,为您的应用增添智能对话能力,需要的朋友可以参考下
    2025-02-02
  • node pnpm修改默认包的存储路径(操作方法)

    node pnpm修改默认包的存储路径(操作方法)

    PNPM是一个新的包管理工具,也是NPM的另一个替代方案,与NPM不同,PNPM使用符号链接(symlink)而不是复制文件来安装包,这篇文章主要介绍了node pnpm修改默认包的存储路径,需要的朋友可以参考下
    2024-05-05
  • 使用node.js半年来总结的 10 条经验

    使用node.js半年来总结的 10 条经验

    从3月初来到帝都某创业公司的服务器团队实习,到现在已接近半年的时间。PS: 已转正,服务器端用的 Node。
    2014-08-08
  • Node.js 使用流实现读写同步边读边写功能

    Node.js 使用流实现读写同步边读边写功能

    本文通过代码给大家介绍了Node.js 使用流实现读写同步边读边写功能,非常不错,具有参考借鉴价值,需要的额朋友参考下吧
    2017-09-09
  • 使用iojs的jsdom库实现同步系统时间

    使用iojs的jsdom库实现同步系统时间

    本文给大家分享的是使用iojs的jsdom库实现与http://open.baidu.com/special/time/ 同步系统时间。思路非常的清晰,这里推荐给大家,有需要的小伙伴可以参考下。
    2015-04-04
  • 使用 Node.js 模拟滑动拼图验证码操作的示例代码

    使用 Node.js 模拟滑动拼图验证码操作的示例代码

    本篇文章主要介绍了使用 Node.js 模拟滑动验证码操作的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • nodejs实现获取某宝商品分类

    nodejs实现获取某宝商品分类

    这篇文章主要介绍了nodejs实现获取某宝商品分类,十分的简单实用,进入后台直接打开控制台,把代码粘进去运行就OK了,有需要的小伙伴可以参考下。
    2015-05-05

最新评论