❤Nodejs 第九章(token身份认证和express-jwt的安装认识)

简介: 【4月更文挑战第9天】Node.js第九章介绍了Token身份认证,特别是JWT(JSON Web Token)作为跨域认证的解决方案。JWT由Header、Payload和Signature三部分组成,用于在客户端和服务器间安全传输用户信息。前端收到JWT后存储在localStorage或sessionStorage中,并在请求头中发送。Express-JWT是一个中间件,用于解析JWT。基本用法包括设置secret和algorithms。注意安全问题,避免混合使用不同算法以防止降级攻击。

❤Nodejs 第九章(token身份认证和express-jwt的安装认识)

1、token基本概念

Session认证的局限性

Session 认证机制需要配合Cookie才能实现。由于 Cookie 默认不支持跨域访问,所以,当涉及到前端跨域请求后端接口的时候,需要做很多额外的配置,才能实现跨域 Session 认证。

注意:

  • 当前端请求后端接口不存在跨域问题的时候,推荐使用 Session 身份认证机制。
  • 当前端需要跨域请求后端接口的时候,不推荐使用 Session 身份认证机制,推荐使用 JWT 认证机制。

什么是token

JWT(英文全称:JSON Web Token)是目前最流行的跨域认证解决方案。

jwt的原理

image.png

总结

  1. 用户的信息通过 Token 字符串的形式,保存在客户端浏览器中。
  2. 服务器通过还原 Token 字符串的形式来认证用户的身份。

jwt的组成

JWT 通常由三部分组成,分别是 Header(头部)、Payload(有效荷载)、Signature(签名)

三者之间使用英文的“.”分隔,格式如下:

js
复制代码
Header.Payload.Signature

// 列如
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7Im5hbWUiOiJ6cyIsInBhc3N3b3JkIjoxMjN9LCJpYXQiOjE2Mzc1MDcyNzksImV4cCI6MTYzNzUxODA3OX0.0o9PCv-11SxM8TgMns--S0D-ZnidYZdXLk13V_B35B0

JWT的三个部分各自代表的含义

JWT 的三个组成部分,从前到后分别是 Header、Payload、Signature。

其中:

  • payload 部分才是真正的用户信息,它是用户信息经过加密之后生成的字符串。
  • HeaderSignature 是安全性相关的部分,只是为了保证 Token 的安全性。

image.png

jwt的使用方式

  • 前端
  1. 客户端收到服务器返回的 JWT 之后,通常会将它储存在localStoragesessionStorage 中。
  2. 此后,客户端每次与服务器通信,都要带上这个 JWT 的字符串,从而进行身份认证。推荐的做法是把 JWT 放在 HTTP 请求头的 Authorization 字段中,格式如下:

    bash
    复制代码
    Authorization: Bearer [token]
  • 后端

    1. 登录成功, 生成token, 返回给浏览器
    2. 所有的接口中. 判断请求头是否携带了token(登录页面除外)

2、使用jwt

express-jwt 介绍和认识 (后面抽离为单个模块)

官网
https://www.tabnine.com/code/javascript/functions/express-jwt/expressJwt

1、简述

JWT ,全称JSON Web Token,本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT token,并且这个JWT token带有签名信息,接收后可以校验是否被篡改,所以可以用于在各方之间安全地将信息作为Json对象传输。

express-jwt是express的中间件,用来解析请求对象的JWT负载。

2、简单用法

使用HS256加密的JWT:

var { expressjwt: jwt } = require("express-jwt");

app.get(
  "/protected",
  jwt({ secret: "helloworld", algorithms: ["HS256"] }),
  function (req, res) {
    if (!req.auth.admin) return res.sendStatus(401);
    res.sendStatus(200);
  }
);

3、express-jwt参数详解

expressjwt的参数列表如下:

secret:必须的参数,为字符串string类型 或者 GetVerificationKey函数接口

GetVerificationKey = (req: express.Request, token: jwt.Jwt | undefined) => Promise<jwt.Secret>;

getToken?:可选的参数,TokenGetter接收快速请求并返回令牌的函数,默认情况下它在Authorization头中查找。

isRevoked?:可选的参数,一个验证令牌是否被撤销的函数,函数接口如下:

IsRevoked = (req: express.Request, token: jwt.Jwt | undefined) => Promise;

credentialsRequired?:可选的参数,类型为bool,当为false时,如果请求不包含令牌,则继续到下一个中间件,而不是失败,默认为true。
requestProperty?:可选的参数,类型为string,请求对象中设置有效负载的属性的名称。

4、安全漏洞

当提供第三方库作为机密时,需要使用算法参数来防止潜在的降级攻击。
不要混合使用对称算法和非对称算法(如HS256/RS256):在没有进一步验证的情况下混合使用算法可能会潜在地导致降级漏洞。

jwt({
  secret: "shhhhhhared-secret",
  algorithms: ["HS256"],
  //algorithms: ['RS256']
});
目录
相关文章
|
3月前
|
JavaScript 前端开发 中间件
探索后端技术:Node.js与Express框架的完美融合
【10月更文挑战第7天】 在当今数字化时代,Web应用已成为日常生活不可或缺的一部分。本文将深入探讨后端技术的两大重要角色——Node.js和Express框架,分析它们如何通过其独特的特性和优势,为现代Web开发提供强大支持。我们将从Node.js的非阻塞I/O和事件驱动机制,到Express框架的简洁路由和中间件特性,全面解析它们的工作原理及应用场景。此外,本文还将分享一些实际开发中的小技巧,帮助你更有效地利用这些技术构建高效、可扩展的Web应用。无论你是刚入门的新手,还是经验丰富的开发者,相信这篇文章都能为你带来新的启发和思考。
|
7天前
|
JavaScript
nodejs安装之npm ERR! code CERT_HAS_EXPIREDnpm ERR! errno CERT_HAS_EXPIRED reason: certificate has expired-证书错误通用问题解决方案-优雅草央千澈
nodejs安装之npm ERR! code CERT_HAS_EXPIREDnpm ERR! errno CERT_HAS_EXPIRED reason: certificate has expired-证书错误通用问题解决方案-优雅草央千澈
|
2月前
|
Web App开发 JavaScript 前端开发
2024年5月node.js安装(winmac系统)保姆级教程
本篇博客为2024年5月版Node.js安装教程,适用于Windows和Mac系统。作者是一名熟悉JavaScript与Vue的大一学生,分享了Node.js的基本介绍、下载链接及简单安装步骤。安装完成后,通过终端命令`node -v`验证版本即可确认安装成功。欢迎关注作者,获取更多技术文章。
38 2
2024年5月node.js安装(winmac系统)保姆级教程
|
2月前
|
Web App开发 JSON JavaScript
Node.js 中的中间件机制与 Express 应用
Node.js 中的中间件机制与 Express 应用
|
2月前
|
缓存 负载均衡 JavaScript
构建高效后端服务:Node.js与Express框架实践
在数字化时代的浪潮中,后端服务的重要性不言而喻。本文将通过深入浅出的方式介绍如何利用Node.js及其强大的Express框架来搭建一个高效的后端服务。我们将从零开始,逐步深入,不仅涉及基础的代码编写,更会探讨如何优化性能和处理高并发场景。无论你是后端新手还是希望提高现有技能的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
2月前
|
存储 JavaScript 搜索推荐
Node框架的安装和配置方法
安装 Node 框架是进行 Node 开发的第一步,通过正确的安装和配置,可以为后续的开发工作提供良好的基础。在安装过程中,需要仔细阅读相关文档和提示,遇到问题及时解决,以确保安装顺利完成。
134 2
|
2月前
|
JavaScript
使用node.js搭建一个express后端服务器
Express 是 Node.js 的一个库,用于搭建后端服务器。本文将指导你从零开始构建一个简易的 Express 服务器,包括项目初始化、代码编写、服务启动与项目结构优化。通过创建 handler 和 router 文件夹分离路由和处理逻辑,使项目更清晰易维护。最后,通过 Postman 测试确保服务正常运行。
109 1
|
2月前
|
JavaScript 中间件 关系型数据库
构建高效的后端服务:Node.js 与 Express 的实践指南
在后端开发领域,Node.js 与 Express 的组合因其轻量级和高效性而广受欢迎。本文将深入探讨如何利用这一组合构建高性能的后端服务。我们将从 Node.js 的事件驱动和非阻塞 I/O 模型出发,解释其如何优化网络请求处理。接着,通过 Express 框架的简洁 API,展示如何快速搭建 RESTful API。文章还将涉及中间件的使用,以及如何结合 MySQL 数据库进行数据操作。最后,我们将讨论性能优化技巧,包括异步编程模式和缓存策略,以确保服务的稳定性和扩展性。
|
2月前
|
JSON 安全 Go
Go语言中使用JWT鉴权、Token刷新完整示例,拿去直接用!
本文介绍了如何在 Go 语言中使用 Gin 框架实现 JWT 用户认证和安全保护。JWT(JSON Web Token)是一种轻量、高效的认证与授权解决方案,特别适合微服务架构。文章详细讲解了 JWT 的基本概念、结构以及如何在 Gin 中生成、解析和刷新 JWT。通过示例代码,展示了如何在实际项目中应用 JWT,确保用户身份验证和数据安全。完整代码可在 GitHub 仓库中查看。
299 1
|
3月前
|
Web App开发 JavaScript 中间件
构建高效后端服务:Node.js与Express框架的完美结合
【10月更文挑战第21天】本文将引导你走进Node.js和Express框架的世界,探索它们如何共同打造一个高效、可扩展的后端服务。通过深入浅出的解释和实际代码示例,我们将一起理解这一组合的魅力所在,并学习如何利用它们来构建现代Web应用。
82 1