JWT 技术的使用

应用场景:访问某些页面,需要用户进行登录,那我们如何知道用户有没有登录呢,这时我们就可以使用jwt技术。用户输入的账号和密码正确的情况下,后端根据用户的唯一id生成一个独一无二的token,并返回给前端,前端把token保存起来,每次发送请求,请求头携带一个token,以表示用户的身份。当然,后端也要进行校验,确保用户的token不是伪造和过期的。

下面举个例子,使用node搭建服务器来详细说明 jwt 的具体用法。

1.用户通过提供身份信息(如账号和密码)进行身份验证

在这里插入图片描述

2.服务器验证用户提供的身份信息,如果验证通过,则并生成一个token并返回给客户端

if (req.query["username"] && req.query["password"]) {const { password, username } = req.query;// 1. 根据用户名查找用户const user = await Admin.findOne({ username }).select("+password");// 如果用户名没找到if (!user) return resp.send({ code: 422, message: "用户不存在!" });// 2. 校验密码(比较明文和密文的密码)const isTrue = require("bcryptjs").compareSync(password, user.password);// 如果密码错误,则抛出错误状态码和错误信息if (!isTrue) return resp.send({ code: 422, message: "密码错误!" });// 3. 返回token值(利用公钥加密用户的唯一id,得到token值,并且设置了过期时间为2小时)const token = jwt.sign({ id: user._id }, app.SECRET, { expiresIn: "2h" });// 查找用户信息const userInfo = await Admin.find({ username: req.query.username }).sort({timeStamp: -1,});// 成功生成 JWT,将 JWT 返回给客户端resp.setHeader("Access-Control-Allow-Origin", "*");resp.setHeader("Access-Control-Expose-Headers", "Authorization");resp.setHeader("Authorization", `Bearer ${token}`);return resp.send({ token, code: 200, userInfo });}

3.客户端将 token 保存到本地中

//设置响应拦截器instance.interceptors.response.use((res) => {if (res.headers.authorization) { const token = res.headers.authorization.split(" ")[1]console.log('token',token);localStorage.setItem('token',token)}// 拦截后需要将拦截下来处理成的结果返回return res.data;},(err) => {console.log(err);});

4.在后续请求中将 token 放在请求的头部,以表示用户的身份

// 请求拦截器instance.interceptors.request.use((config) => {// 将token拿出来,拼接到请求头上const token = localStorage.getItem("token");if (token) {config.headers.Authorization = `Bearer ${jwt}`;}//请求成功的函数return config;},(err) => {return err;});

5.服务器在接收到请求时,验证 token 的有效性,并根据其中的信息进行授权和验证。

// 判断用户token是否合法router.get("/verify", async (req, resp) => {const { token } = req.query;console.log(token);**// 如果token是伪造的,则直接抛出异常try {const obj = jwt.verify(token, app.SECRET);console.log(obj);// obj.exp 是过期的时间(单位为s)if (Date.now() >= obj.exp * 1000) {resp.send({ code: 401, message: "无效的JWT令牌" });} else { resp.send({ code: 200, message: "success" });}} catch (error) {resp.send({ code: 401, message: "无效的JWT令牌" });}});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1620917.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

bindService的调用流程

使用bindService去调用service,如果有多个客户端调用,onBind方法只会被调用一次,由于bindService嗲处理中,AMS是一个中间商,猜测这个处理也是AMS里进行的,这里我们再看看bindService的调用流程 public clas…

【翻译】开发人员的技术写作

HTML、CSS、JavaScript、Python、PHP、C、Dart--有这么多的编程语言,你甚至可能完全精通其中的几种但是,当我们的目标是写出更多、更好的代码时,我们用日常语言写作和交流的方式变得越来越重要......甚至可能被忽略了。 我们写代码和围绕代码…

AIGC用于智能写作的技术综述-达观数据

导语 图1. ChatGPT生成的关于智能写作的介绍 智能写作指使用自然语言处理技术来自动生成文本内容。这种技术通过分析给定语料库,学习文本的结构和语法,然后利用这些信息来生成新的文本。智能写作可以用来快速生成高质量的文本内容,并且可…

玩转ChatGPT:论文辅助写作(附Claude测评)

一、写在前面 嘿!嘿!嘿!大家好,今天我们来聊一下使用GPT们进行论文辅助写作。不过,我要先交代一下,GPT的使用门槛比较高,不少童鞋都用不上。所以,我极力推荐一个平替产品——Claude…

帮你的英文写作一键纠错,微软升级版AI批改软件有这些亮点

你的英语还好吗? 学英语时,“听说读写”是四大核心要素, 而“写”可谓是英语学习中最考验学习者综合语言运用能力的一项。 在写作的时候,你会面临写错、单词匮乏以及语法错误等诸多问题,但如果让你自己或者找别人修改…

系统集成项目管理工程师【中级】考证学习资料知识点整理分享——第二章《信息系统集成及服务管理》,持续更新中........

系统集成项目管理工程师(中级)考证学习资料整理分享,持续更新中........ 目 录 第二章《信息系统集成及服务管理》 一、信息系统集成及服务管理 (一)信息系统集成及服务管理的内容 (二)信息系统集成及服务管理的推进 1.实施信息系统集成及服务资质管理制度 1)…

webassembly003 ggml GGML Tensor Library part-3

关于pthread_create()和pthread_join() #include <stdio.h> #include <pthread.h>void *thread_func(void *arg) {int *num (int *)arg;printf("Hello from thread! arg%d\n", *num);pthread_exit(NULL); }int main() {pthread_t thread;int arg 10;i…

数据结构--树4.2(二叉树)

目录 一、二叉树的定义和特点 1、定义 2、特点 二、二叉树的基本形态 1、空二叉树 2、只有一个根结点 3、根结点只有左子树 4、根结点只有右子树 5、根结点既有左子树又有右子树 6、斜树 7、满二叉树 8、满二叉树和完全二叉树 三、二叉树的性质 一、二叉树的定义和…

Presto之Driver个数

一. 前言 在Presto的Stage Performace中&#xff0c;每个Operator中都会有Driver个数的显示&#xff0c;如下图所示。本文主要介绍Presto中是如何决定Driver的个数的。 二. Driver个数 在Presto中&#xff0c;一个pipeline中启动多少个Driver&#xff0c;是由此Pipeline处理的S…

新增收货地址【项目 商城】

新增收货地址【项目 商城】 新增收货地址1 新增收货地址-数据表创建2 新增收货地址-创建实体类3 新增收货地址-持久层3.1 各功能的开发顺序3.2 规划需要执行的SQL语句3.3 接口与抽象方法3.4 配置SQL映射 测试4 新增收货地址-业务层4.1 规划异常4.2 接口与抽象方法 测试5 新增收…

epoll() 多路复用 和 两种工作模式

1.epoll API 介绍 typedef union epoll_data {void *ptr;int fd;uint32_t u32;uint64_t u64; } epoll_data_t;struct epoll_event {uint32_t events; /* Epoll events */epoll_data_t data; /* User data variable */ };常见的Epoll检测事件&#xff1a;- EPOLLIN- EPOLLOUT- …

农村农产品信息展示网站的设计与实现(论文+源码)_kaic

摘 要 随着软件技术的迅速发展,农产品信息展示的平台越来越多,传统的农产品显示方法将被计算机图形技术取代。这种网站技术主要把农产品的描述、农产品价格、农产品图片等内容&#xff0c;通过计算机网络的开发技术&#xff0c;在互联网上进行展示&#xff0c;然后通过计算机网…

如何识别计算机病毒,怎样识别计算机病毒

电脑病毒不仅影响电脑的正常使用&#xff0c;有时候还会威胁到我们的个人信息包括财务信息的安全。下面就让学习啦小编教大家怎样识别计算机病毒吧。 识别计算机病毒的方法 病毒一般通过自我隐藏的方式来达到自己的目的&#xff0c;那么病毒一般都隐藏在系统的什么地方呢?一般…

计算机病毒为了隐藏,识别计算机病毒的方法

识别计算机病毒的方法 病毒为了能随系统启动而自启动对电脑进行危害操作&#xff0c;通常会把自己设置为自动启动。更有甚者&#xff0c;它们还会将自己注册成系统服务&#xff0c;优先于其他程序启动。下面是小编收集整理的识别计算机病毒的方法&#xff0c;欢迎阅读。 识别计…

可以查杀计算机病毒的软件,怎样彻底查杀计算机病毒

电脑中毒后很可能后导致电脑出现无法开机,卡死等各种的情况&#xff0c;那么怎样彻底查杀计算机病毒呢?学习啦小编分享了彻底查杀计算机病毒的方法&#xff0c;希望对大家有所帮助。 彻底查杀计算机病毒方法一 打开腾讯电脑管家&#xff0c;并找到杀毒页面 选择【闪电查杀】等…

检查和清除计算机病毒可以使用,如何深入检查和杀死计算机病毒

当我们的计算机感染病毒时&#xff01;如果我们想深入查杀&#xff0c;该怎么办&#xff1f;以下是学习编辑器深入检查和杀死计算机病毒的方法的详细介绍&#xff01;希望对您有帮助&#xff01; 一种深度检测计算机病毒的方法: 垃圾清除软件建议安装金山卫士&#xff0c;它可以…

2. 两数相加(中等系列)

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

如何根据公司名称来筛选快递

在查询快递物流的时候&#xff0c;如果想要对快递公司名称一致的单号进行筛选&#xff0c;该怎么办呢&#xff1f;不知道如何操作的宝贝们&#xff0c;下面请随小编一起来试试。 需要哪些工具&#xff1f; 快递批量查询高手 快递单号若干 怎么快速查询&#xff1f; 首先&…

关于名字

为什么80%的码农都做不了架构师&#xff1f;>>> 书不尽言&#xff0c;言不尽意。言者所以在意&#xff0c;得意而忘言。先从程序里的变量名说起。作为程序员&#xff0c;我们知道&#xff0c;大部分时候&#xff0c;我们要求程序中的变量名是唯一的。比如数据库里的…

2023-2029全球与中国电子级丙二醇甲醚醋酸酯市场现状及未来发展趋

电子级丙二醇甲醚醋酸酯的定义 丙二醇甲醚醋酸酯(PMA)&#xff0c;也称丙二醇单甲醚乙酸酯&#xff0c;是一种无色、有特殊气味的高级溶剂。PMA分子中既有醚键&#xff0c;又有羰基&#xff0c;羰基又形成了酯的结构&#xff0c;同时又有烷基&#xff1b;PMA同一分子中极性与非…