❤Node11-登录人token信息接口

❤Node11-登录人token信息接口​

上一章我们已经从登录部分拿到了用户的登录jwt返回的token信息,接下来我们就通过token来换取用户信息 这里我们可以将其理解为一种加密以及解密的思想来思考这个jwt和token的关系,token就是一个加密的字符串,而jwt就是那把钥匙。

1、解析 JWT字符串 还原为JSON对象​

客户端每次在访问那些有权限接口的时候,都需要主动通过请求头中的 **Authorization** 字段,将 Token 字符串发送到服务器进行身份认证。 此时,服务器可以通过 express-jwt这个中间件,自动将客户端发送过来的 Token 解析还原成 JSON 对象: token解析如下:

app.use(expressJWT.expressjwt({ secret: secretKey, algorithms: ["HS256"] }).unless({// path: [/^\/api\//],path: ['/','/api/login','/api/register','/api/resetPwd']})
);

image.png

这个时候我们请求的接口里面携带一下刚刚的token然后访问一下试试

jsaxios({method: 'get',url: api,headers: {'Authorization': 'Bearer '+localStorage.getItem("login"),'Content-Type': 'application/json;charset=utf-8','Custom-Header': 'custom-value'},params: params,}).then(res => {console.log(res.data);if (res.status == 200) {// console.log(res, 'res');tableData.value = res.data.data;totalvalue.value = res.data.total;}}).catch(error => {console.error(error);});

可以看到,这个时候我们的接口请求参数已经完全没问题了!

image.png

2、 获取用户信息(接口)​

当 express-jwt 这个中间件配置成功之后,即可在那些有权限的接口中,使用 req.user 对象,来访问从 JWT 字符串中解析出来的用户信息了,示例代码如下:

js// 这是一个有权限的api接口
app.get('/api/getInfo', (req, res) => {console.log(req.user);res.send({status: 200,message: 'success',data: req.user,})
})

从上面我们注册时候的接口可以看到,我们当时候注册了一个用户的username

image.png

返回的信息如下:

image.png

jsreq.auth信息如下:
{ username: 'admin', iat: 1713773255, exp: 1713780455 }

返回的信息内容如下:

js-   `username: 'admin'`: 这是 JWT 中存储的用户名信息,指示该令牌是以管理员身份签发的或者与管理员相关联的。
-   `iat: 1713773255`: 这是 JWT 的 "issued at"(签发时间)字段,表示 JWT 的签发时间。它是一个 Unix 时间戳,表示从 1970 年 1 月 1 日 00:00:00 UTC 到签发 JWT 的时间经过的秒数。
-   `exp: 1713780455`: 这是 JWT 的 "expiration time"(过期时间)字段,表示 JWT 的过期时间。也是一个 Unix 时间戳,表示 JWT 过期的时间点。在这个时间点之后,JWT 将不再被认为是有效的,需要重新获取新的 JWT。

从这个返回信息的签发时间,我们可以思考一下可以起到什么样的用途呢:

3、查询我们数据用户信息​

通过我们的用户接口返回的username参数去查询我们数据用户信息

jsapp.get('/api/getInfo', (req, res) => {// 查询用户详情接口 const values=[req.auth.username];let query = 'SELECT * FROM user WHERE username = ?';connectionpool.query(query, values, (err, results) => {if (err) {console.error('Error querying database:', err);res.status(500).json({ error: '用户不存在!' });return;}else{res.json({code: '200',data: results,});}});
})

最后我们查到的数据库信息如下: 可以看到我们查出来的其实是一个数组,这个时候我们可以优化一下,当查询出来的数据是空数据的时候,默认给个赋值,当含有数据的时候,拿数组的第一项数据 优化结果

jsdata: results?.length>0? results[0] : {},

image.png

4、测试使用用户信息接口​

接下来我们找个网页利用axios(自己把token给放进去哦记得!)尝试请求一下看是否可以获取对应的用户信息

js// 获取用户信息
function getUserinfo() {let api = "http://localhost:8888/api/getInfo";axios({method: 'get',url: api,headers: {'Authorization': 'Bearer '+localStorage.getItem("login"),'Content-Type': 'application/json;charset=utf-8','Custom-Header': 'custom-value'},}).then(res => {console.log(res.data);if (res.status == 200) {console.log(res, 'res-获取用户信息');}}).catch(error => {console.error(error);});}

在我们自己封装的项目之中进行封装一下

js// 获取用户信息
export function getInfo () {return request({url: '/api/getInfo',method: 'get',})
}import React,{ useEffect } from "react";
import { getInfo } from '@/api/common/comon';// 获取用户信息
const getUserInfo = () => {console.log('获取用户信息');getInfo().then(res => {console.log(res,'获取用户信息');setUserinfo(res.data);})
}useEffect(() => {console.log('useEffect-home');getUserInfo();
},[])

image.png

查询没问题,可以获取用户的信息!

5、优化用户信息接口​

👍 time(2024-8-10) 优化提示信息​

之前我们简单实现了我们的用户信息接口,但是在使用token换取信息的过程之中,很多次都是直接500,但是找不到其中的原因 接下来我们完善优化一下我们的用户信息接口

  • 授权信息提示的完善

jsif (!req.auth || !req.auth.username) {return res.status(401).send({code: 401,message: '未认证用户或缺少用户名!',});
}
  • 优化一下信息提示部分

jsif (err) {console.error('Error querying database:', err);return res.status(500).send({code: 500,message: '数据库查询错误!',});
}if (results.length === 0) {return res.status(404).send({code: 404,message: '用户不存在!',});
}res.send({code: 200,data: results[0],message: '欢迎你的访问!',
});

👍 time(2024-8-14)处理问题​

今天访问接口,一直提示我这个问题

js{code: 500, message: "服务器错误!"}

然后我找了一遍可能是链接过程的问题,之前我们对于接口500的时候进行了一个拦截,我们打印出来看看

js// 接口错误的封装---拦截部分
app.use((err, req, res, next) => {// 如果错误是由token解析失败导致的if (err.name === 'UnauthorizedError') {return res.send({code: 401,message: '登录过期,请重新登录!'})}console.log('其他原因导致的错误!',err);// 如果是其他位置原因导致的错误res.send({code: 500,message: '服务器错误!'})next()
})

输出以后我们能看到消息,这里我的报错部分是这样子的:

js

查询语句 SELECT * FROM user WHERE username = ?
其他原因导致的错误! ReferenceError: connectionpool is not defined

原来是我们项目大小写的原因,这里我们改一下,因为之前我们拆分模块的时候,把所有的 connectionpool=> connectionPool ,更改为了小驼峰命名,所以,这里出现问题,建议大家还是细心啊!

image.png

再次查询,这里问题已经处理好了!

image.png

👍 优化返回信息接口user​

之前我们直接返回的data信息,这里我们返回来的部分更改为user用户信息

js

res.send({code: 200,data: results[0],message: '欢迎你的访问!',
});=> 更改为res.send({code: 200,user: results[0],message: '欢迎你的访问!',
});

报错​

expressJWT is not a function(expressJWT版本语法)​

导入和使用expressJWT时遇到问题

c

import expressJWT  from 'express-jwt' 
app.use(expressJWT({ secret: secretKey }).unless({ path: ['/login'] }))

image.png

原因 由于express-jwt 版本的更新,之前的语法不适用于现在的 新版本 ,可以看到现在 是 8 开头的版本 express-jwt8的版本如下图所示:

javascript

 app.use(expressJWT.expressjwt({ secret: secretKey, algorithms: ["HS256"] }).unless({// path: [/^\/api\//],path: ['/','/api/login','/api/register','/api/resetPwd']})
);

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

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

相关文章

python 斑马打印模板

打印代码逻辑如下; 包括样式、表格 import win32printdef print_zpl_from_usb_printer(printer_name, zpl_content):# 打开打印机hPrinter win32print.OpenPrinter(printer_name)if hPrinter is None:print(f"Failed to open printer: {printer_name}")…

Spring Cloud Alibaba-(6)Spring Cloud Gateway【网关】

Spring Cloud Alibaba-(1)搭建项目环境 Spring Cloud Alibaba-(2)Nacos【服务注册与发现、配置管理】 Spring Cloud Alibaba-(3)OpenFeign【服务调用】 Spring Cloud Alibaba-(4)Sen…

商标管理软件如何助力企业实现商标数字化管理?

商标作为企业的无形资产和品牌形象的核心,其管理方式的数字化升级已成为企业不可回避的课题。启服云商标管理软件凭借其强大的功能和灵活的解决方案,正帮助企业商标管理向数字化、智能化方向迈进,为企业品牌保护和市场拓展提供了强有力的支撑…

apache paimon简介(官翻)

介绍 如下架构所示: 读/写操作: Paimon 支持多样化的数据读写方式,并支持 OLAP 查询。 读取: 支持从历史快照(批处理模式)中消费数据,从最新偏移量(流处理模式)中读取数据,或以混合方式读取增量快照。写入: 支持从数据库变更日志(CDC)进行流式同步,从离线数据中…

QT菜单栏设计(二级菜单栏)

目的:创建一级菜单栏,添加对应选项,并向一级菜单栏中添加二级菜单栏选项。 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindo…

科研绘图系列:R语言堆积图(stacked barplot)

文章目录 介绍加载R包导入数据数据预处理画图导出数据系统信息介绍 微生物堆积图是一种数据可视化工具,通常用于展示微生物群落中不同物种的相对丰度。这种图表通过将每个样本中的微生物按照其分类学等级(如门、属等)进行分类,并以不同颜色的块状图表示,每个块的大小代表…

基于SSM+Android的签到系统

目录 前言 功能设计 系统实现 获取源码 博主主页:百成Java 往期系列:Spring Boot、SSM、JavaWeb、python、小程序 前言 随着Internet的发展,人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化,网络化和…

Leetcode 2246. 相邻字符不同的最长路径(一般树)树形dp C++实现

问题:Leetcode 2246. 相邻字符不同的最长路径 给你一棵 树(即一个连通、无向、无环图),根节点是节点 0 ,这棵树由编号从 0 到 n - 1 的 n 个节点组成。用下标从 0 开始、长度为 n 的数组 parent 来表示这棵树&#x…

Debezium

Debezium 是一个开源的分布式平台,用于捕获数据库变化数据(Change Data Capture, CDC)。允许用户实时地从数据库中捕捉到数据的变化(如插入、更新和删除操作),并将这些变化以结构化的数据流的形式提供给其他…

Java | Leetcode Java题解之第429题N叉树的层序遍历

题目&#xff1a; 题解&#xff1a; class Solution {public List<List<Integer>> levelOrder(Node root) {if (root null) {return new ArrayList<List<Integer>>();}List<List<Integer>> ans new ArrayList<List<Integer>&g…

语音识别控制(软件、硬件)

1. 环境 python版本&#xff1a;3.11.9 2. 完整代码 import sqlite3 import time import wave # 使用wave库可读、写wav类型的音频文件 from funasr import AutoModel import sounddevice as sd import numpy as np from modelscope import pipeline, Tasks from pypinyin …

centos7安装docker DokcerCompose

一, 安装docker 1.更新yum源 yum下载很慢&#xff0c;一直出现正在尝试其它镜像&#xff0c;更改yum地址为阿里云镜像即可 1&#xff09;下载了阿里云提供的CentOS 7的Yum源配置文件&#xff0c;并将其覆盖到系统中的 /etc/yum.repos.d/CentOS-Base.repo 文件。 wget -O /et…

简单计算器(python基础代码撰写)

简单计算器&#xff1a;仅适用无括号加减乘除&#xff0c;算法初阶&#xff0c;代码基础&#xff0c;不调库或模块“纯”手撕。 (笔记模板由python脚本于2024年09月22日 12:08:02创建&#xff0c;本篇笔记适合喜欢用python解决实际问题的coder翻阅) 【学习的细节是欢悦的历程】…

宠物鱼油补充剂行业调研:未来几年年复合增长率CAGR为7.8%

宠物鱼油补充剂是一种营养补充剂&#xff0c;富含从鱼类中提取的欧米伽-3 脂肪酸&#xff08;主要是 EPA 和 DHA&#xff09;&#xff0c;专为宠物设计&#xff0c;以改善其健康状况。鱼油补充剂富含奥米加-3 脂肪酸&#xff0c;已被证明对宠物健康有诸多益处&#xff0c;包括改…

分布式环境中,接口超时到底怎么处理?

目录标题 为什么会存在超时?如何应对可能发生的超时?1. 设置合理的超时时间2. 重试机制3. 熔断机制4. 监控和报警5. 日志记录6. 限流和降级7. 异步处理 以上总结 为什么会存在超时? 接口超时是分布式系统中常见的问题&#xff0c;其原因多种多样&#xff0c;涉及网络、服务…

文件系统(软硬链接 动静态库 动态库加载的过程)

文章目录 软硬链接软链接软链接有什么用&#xff1f; 硬链接硬链接有什么用&#xff1f; 动静态库Linux中的动静态库库静态库 && 安装库动态库动态库 VS 静态库用第三方库 动态库加载elf头部信息 软硬链接 先看现象&#xff1a;先创建一个文件&#xff0c;并写入内容 …

ELK-01-elasticsearch-8.15.1安装

文章目录 前言一、下载elasticsearch二、将tar包放到服务器三、解压tar包四、更改配置文件五、添加启动用户六、用elasticserch用户启动6.1 报错6.2 解决问题16.3 解决问题26.4 再次用elasticserch用户启动6.5 windows浏览器打开 七、设置开机自动启动7.1 创建启动脚本7.2 在脚…

在Java中 String能存储多少个字符?

经典面试题 关于String能存储多个字符&#xff0c;这个是面试者在面试中经常被提及的问题&#xff0c;这个问题可以问的很浅&#xff0c;也可以问的很深&#xff0c;具体看面试官看了你的简历后&#xff0c;对你的能力有什么样的看法&#xff0c;今天&#xff0c;我们就这个问…

postman发送与返回,GET与POST使用

1.GET 获取主页 发送&#xff1a; uri: ‘/’ 返回&#xff1a; 2.POST 发送密码 发送&#xff1a; uri: ‘/login.html’ 返回&#xff1a; 3.POST 保存参数 发送&#xff1a; 返回&#xff1a; 4.GET 获取参数 在POST密码之后&#xff0c;服务器发送一个H…

西门子PCS7在CFC中如何连接DB块中的变量

在CFC中所连接的DB块必须是用户数据块(User DB)。在CFC中通过菜单Options Customize Compile/Download… 可以查看和修改用户数据块的范围&#xff0c;默认范围是DB1-DB60&#xff0c;超出该范围的DB块在CFC中无法引用&#xff0c;如果引用了&#xff0c;CFC编译时会提示错误。…