iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >nodejs中如何使用JWT
  • 740
分享到

nodejs中如何使用JWT

2023-07-04 22:07:26 740人浏览 独家记忆
摘要

这篇“nodejs中如何使用Jwt”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“nodejs中如何使用JWT”文章吧。什么是

这篇“nodejs中如何使用Jwt”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“nodejs中如何使用JWT”文章吧。

什么是JWT

JWT也就是JSON Web Token的缩写,也就是为了在网络应用环境中一种认证解决方案,在传统的认证机制中,无非是一下几个步骤:

1. 用户将账号密码发送到服务器;2. 服务器通过验证账号密码后,会在当前session中保存一些用户相关的信息,用户角色或者过期时间等等;3. 服务器给用户一个session_id, 写入用户的Cookie或者客户端自行保存在本地;4. 用户每次请求服务,都需要带上这个session_id,或许会通过Cookie,或者其他的方式;5. 服务器接收到后,回去数据库查询当前的session_id,校验该用户是否有权限;

这种模式有一种优势在于,服务器随时可以终止用户的权限,可以去数据库修改或者删除当前用户的session信息。但是也有一点不好的,就是如果是服务器集群的话,所有的机器就需要共享这些session信息,确保每台服务器都能够获取到相同的session存储信息。虽然可以解决这些问题,但是工程量巨大。

JWT方案的优势呢,就是不保存这些信息,token数据保存在客户端,每次接受请求时,只需要校验就好。

JWT的原理

简单说一下JWT的原理,其实就是客户端发送请求认证的时候,服务器在认证用户之后,会生成一个JSON对象,大概包括“你是谁,你是干嘛的等等,到期时间”这些信息,重要的是一定要有到期时间;大致格式为:

{    username: "贼烦字符串er",    role: "世代码农",    endTime: "2022年5月20日"}

但是不会用这么肤浅的方式传给你,它会通过制定的签名算法和你提交的payload的一些信息进行可逆的签名算法进行签名后传输,大致的格式我用一张图片表示:

nodejs中如何使用JWT

由图片可以看出,返回的信息大致分为三部分,左侧为签名之后的结果,也就是返回给客户端的结果,右侧也是就Decoded的源码了,三部分由“点”隔开,分别由红、紫、青三种颜色一一对应:

  • 第一个红色部分是Header,Header中主要是指定了的方式,图中的签名算法(默认HS256)就是带有 SHA-256 的 HMac 是一种对称算法, 双方之间仅共享一个密钥,typ字段标识为JWT类型;

  • 第二个紫色部分payload,就是一个JSON对象,也就是实际要传输的数据,官方有七个字段可以使用:

    • iss (issuer):签发人

    • exp (expiration time):过期时间

    • sub (subject):主题

    • aud (audience):受众

    • nbf (Not Before):生效时间

    • iat (Issued At):签发时间

    • jti (JWT ID):编号

除了这些字段,你还可以搞一些自定义的字段,由于JWT默认是不加密的,所以在使用的时候尽量注意不要使用一些敏感数据。

  • 第三部分就是Signature签名,这一部分,是由你自己指定且只有服务器存在的秘钥,然后使用头部指定的算法通过下面的签名方法进行签名。

JWT的简单使用

下面我们来感受一下具体的使用:

我们需要搭建一个node的项目;通过npm init -y初始化一个项目;之后我们需要安装依赖,分别按状expressjsonWEBtokennodemon三个依赖:

$ npm i express jsonwebtoken nodemon

之后在package.json中的scripts字段中添加nodemon app.js命令:

"scripts": {    "start": "nodemon app.js"},

初始化一下node应用,在根目录下创建app.js文件;

// app.jsconst express = require("express");const app = express();app.use(express.json());app.listen(3000, () => {  console.log(3000 + " listening..."); // 监听3000端口});

引入jsonwebtoken依赖,并且创建接口和服务器的私钥;

// app.js//...const jwt = require("jsonwebtoken");const jwTKEy = "~!@#$%^&*()+,";// ...

这里面的jwtKey是我们自定义保存仅限保存在服务器中的私钥,之后我们开始写一个 /login 接口,用来登录,并且创建本地的模拟数据库用来校验,并通过jwt.sign方法进行校验签名:

// app.jsconst database = {  username: "username",  passWord: "password",};app.post("/login", (req, res) => {  const { username, password } = req.body;  if (username === database.username && password === database.password) {    jwt.sign(      {        username,      },      jwtKey,      {        expiresIn: "30S",      },      (_, token) => {        res.json({          username,          message: "登陆成功",          token,        });      }    );  }});

上面代码中我们创建了database变量来模拟创建了本地的账号密码数据库,用来校验登陆;接下来建立了一个/loginpost接口,在校验账号密码完全匹配之后,我们通过jsonwebtoken包导入的jwt对象下的人sign方法进行签名,这个方法有三种接口签名:

export function sign(    payload: string | Buffer | object,    secretOrPrivateKey: Secret,    options?: SignOptions,): string;export function sign(    payload: string | Buffer | object,    secretOrPrivateKey: Secret,    callback: SignCallback,): void;export function sign(    payload: string | Buffer | object,    secretOrPrivateKey: Secret,    options: SignOptions,    callback: SignCallback,): void;

这里用到了函数重载的方式实现接口,我们这里将实现最后一个接口签名,第一个参数可以是一个自定义的对象类型,也可以是一个Buffer类型,还可以直接是一个string类型,我们的源码使用了object类型,自定义了一些字段,因为jwt在进行签名是也会对这些数据一并进行签名,但是值得注意的是,这里尽量不要使用敏感数据,因为JWT默认是不加密的,它的核心就是签名,保证数据未被篡改,而检查签名的过程就叫做验证

当然你也可以对原始Token进行加密后传输;

第二个参数:是我们保存在服务器用来签名的秘钥,通常在客户端-服务端模式中,JWS 使用 JWA 提供的 HS256 算法加上一个密钥即可,这种方式严格依赖密钥,但在分布式场景,可能多个服务都需要验证JWT,若要在每个服务里面都保存密钥,那么安全性将会大打折扣,要知道,密钥一旦泄露,任何人都可以随意伪造JWT。

第三个参数:是签名的选项SignOptions,接口的签名:

export interface SignOptions {    alGorithm?: Algorithm | undefined;    keyid?: string | undefined;    expiresIn?: string | number | undefined;        notBefore?: string | number | undefined;    audience?: string | string[] | undefined;    subject?: string | undefined;    issuer?: string | undefined;    jwtid?: string | undefined;    mutatePayload?: boolean | undefined;    noTimestamp?: boolean | undefined;    header?: JwtHeader | undefined;    encoding?: string | undefined;}

这里我们用的是expiresIn字段,指定了时效时间,使用方法参考这个文档;

第四个参数是一个回调,回调的第二个参数就是我们通过签名生成的token,最后将这个token返回给前端,以便存储到前端本地每次请求是带上到服务端进行验证。

接下来,我们来验证一下这个接口:我是在vscode安装的REST Client插件,之后在根目录创建一个request.Http的文件,文件内写上请求的信息:

POST http://localhost:3000/logincontent-type: application/json{  "username": "username",  "password": "password"}

之后在命令行执行npm run start命令启动服务,之后在requset.http文件上方点击Send Request按钮,发送请求:

nodejs中如何使用JWT

请求成功后,会看到这样的响应报文:

nodejs中如何使用JWT

token字段就是我们JWT生成的token;

下面来验证一下这个token是否有效,我们在写一个登录过后的接口:

app.get("/afterlogin", (req, res) => {  const { headers } = req;    const token = headers["authorization"].split(" ")[1];  // 将token放在header的authorization字段中  jwt.verify(token, jwtKey, (err, payload) => {    if (err) return res.sendStatus(403);    res.json({ message: "认证成功", payload });  });});

这段代码中,通过获取请求头中的authorization字段中的token进行获取之前通过JWT生成的token。之后通过调用jwt.verify校验方法校验这个token是否有效,这个方法分别有三个参数:

// 有四个接口签名,可以自行查文档export function verify(    token: string,    // 需要检验的token    secretOrPublicKey: Secret | GetPublicKeyOrSecret,    // 定义在服务器的签名秘钥    callback?: VerifyCallback<JwtPayload | string>,    // 获取校验信息结果的回调): void;

接下来我们把刚才响应的token复制到请求头中:

###GET http://localhost:3000/afterloginauthorization: Bearer eyJhbGCiOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiaWF0IjoxNjUyNzg5NzA3LCJleHaiOjE2NTI3ODk3Mzd9.s9fk3YLhxTUcpUgCfIK4xQN58Hk_XEP5y9GM9A8jBbY

前面的Bearer认证, 是http协议中的标准认证方式

同样点击Send Request当看到下面图片的响应,就意味着响应成功:

nodejs中如何使用JWT

其实以上就是JWT的一些简单的用法,接下来再说一下JWT本身存在的优缺点.

JWT的不足

  • JWT占用的存储空间其实并不小,如果我们需要签名做过多的信息,那么token很可能会超出cookie的长度限制,例如对比一下这两张图片:

nodejs中如何使用JWT

很明显,随着payload的信息量增大,token的长度也会增加;

  • 安全性,其实如果token的占用空间过大,Cookie最大存储空间只有4kb前端可以存储在localStorage之类的本地存储,但是会带来一个问题,如果不是放在cookie的话,安全性就会大打折扣,就会有通过js脚本获取到的风险,就意味着任何hacker都可以拿着它做任何事情;

  • 不灵活的时效性,其实JWT的某方面意义在于用户token不需要持久化存储,而是采用服务器校验的方式对token进行有效校验,刚才看到了,签名也是把到期时间一并签名的,如果改变到期时间token就会被篡改,由于没有存储和手动更改时效的方法,所以很难立刻将这个token删掉,如果用户重复登陆两次,生成两个token,那么原则上两个token都是有效的;

以上就是关于“nodejs中如何使用JWT”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: nodejs中如何使用JWT

本文链接: https://www.lsjlt.com/news/347973.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • nodejs中如何使用JWT
    这篇“nodejs中如何使用JWT”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“nodejs中如何使用JWT”文章吧。什么是...
    99+
    2023-07-04
  • JWT如何在nodejs中使用
    这篇文章主要介绍“JWT如何在nodejs中使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JWT如何在nodejs中使用”文章能帮助大家解决问题。什么是JWTJ...
    99+
    2024-04-02
  • 浅析nodejs中怎么使用JWT?
    同样点击Send Request当看到下面图片的响应,就意味着响应成功:其实以上就是JWT的一些简单的用法,接下来再说一下JWT本身存在的优缺点.JWT的不足JWT占用的存储空间其实并不小,如果我们需要签名做过多的信息,那么token很可能...
    99+
    2023-05-14
    JWT node
  • nodejs如何实现jwt
    这篇文章主要介绍“nodejs如何实现jwt”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs如何实现jwt”文章能帮助大家解决问题。1.为什么需要会话管理我们用nodejs为前端或者其他服...
    99+
    2023-07-05
  • nodejs中的express-jwt的使用解读
    目录nodejs中express-jwt的使用nodejs express-jwt is not a function问题总结nodejs中express-jwt的使用 expres...
    99+
    2023-05-16
    nodejs中express-jwt express-jwt的使用 nodejs使用express-jwt
  • thinkphp6.0.7中如何使用JWT
    本篇内容介绍了“thinkphp6.0.7中如何使用JWT”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!JWT是什么JWT是json web...
    99+
    2023-06-22
  • Jwt如何在Java中使用
    这篇文章给大家介绍Jwt如何在Java中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对象;3. 分布性,Java是...
    99+
    2023-06-14
  • nodejs中的jwt是什么
    这篇文章主要讲解了“nodejs中的jwt是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nodejs中的jwt是什么”吧! ...
    99+
    2024-04-02
  • 使用NodeJS实现JWT原理是什么
    这篇文章主要介绍“使用NodeJS实现JWT原理是什么”,在日常操作中,相信很多人在使用NodeJS实现JWT原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”使用No...
    99+
    2024-04-02
  • 如何使用nodejs中的koa
    本篇内容主要讲解“如何使用nodejs中的koa”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用nodejs中的koa”吧! ...
    99+
    2024-04-02
  • 如何在Nodejs中使用forEach
    如何在Nodejs中使用forEach?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。利用数组对象方法push/shift可实现队列先进先出特性,例如:>a=[][]>...
    99+
    2023-06-06
  • nodejs 如何使用
    Node.js 是一个运行在服务器端的 JavaScript 运行时环境,它能够解析和执行 JavaScript 代码。Node.js 很容易上手,因为 JavaScript 是世界上最流行的编程语言之一,并且 Node.js 有着庞大的社...
    99+
    2023-05-16
  • nodejs中Express中间件如何使用
    本篇文章给大家分享的是有关nodejs中Express中间件如何使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Express是一个基于No...
    99+
    2024-04-02
  • Nodejs中express和ejs如何使用
    Nodejs中express和ejs如何使用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。var express =&...
    99+
    2024-04-02
  • Nodejs中如何使用crypto模块
    本篇文章给大家分享的是有关Nodejs中如何使用crypto模块,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。crypto模块是nodejs的...
    99+
    2024-04-02
  • nodejs中superagent和cheerio如何使用
    这期内容当中小编将会给大家带来有关nodejs中superagent和cheerio如何使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。准备工作  使用npm管理依赖,...
    99+
    2024-04-02
  • Go语言如何使用golang-jwt/jwt/v4进行JWT鉴权详解
    目录前言1.什么是JWT2.JWT的数据结构2.1 Header2.2 Payload2.3 Signature2.4 Base64URL3使用JWT安装生成Token总结前言 最近...
    99+
    2024-04-02
  • NodeJS使用JWT跨域身份验证方案详解
    目录JWT(jsonwebtoken)在nodejs中使用安装使用场景JWT(jsonwebtoken) 目前最流行的跨域身份验证解决方案 在nodejs中使用 安装 npm ins...
    99+
    2023-02-06
    NodeJS JWT跨域身份验证 NodeJS JWT NodeJS跨域身份验证
  • nodejs如何使用debug
    Node.js作为一种非常流行的后端编程语言,广泛应用于开发各种Web应用、服务器、工具、框架和库等。但是,在开发过程中难免会出现各种各样的问题,例如代码错误、逻辑错误等等。这时候,一个好的调试工具是非常重要的。Node.js的调试工具被称...
    99+
    2023-05-14
  • 如何使用nodejs then
    本篇内容介绍了“如何使用nodejs then”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作