nodejs登录生成token并验证

目录

一、基础概念

二、JTW

三、实践


 一、基础概念

"token": 是一个通用的术语,指代一种用于表示身份、权限或访问凭证的数据结构。它可以是一个字符串、数字或其他形式的数据。

主要用途:

  1. 身份验证:在身份验证过程中,用户提供凭据(如用户名和密码),服务器验证凭据的有效性后会颁发一个身份验证令牌给用户。这个令牌可以是一个长期有效的持久令牌,也可以是一个短期有效的临时令牌,用于后续的请求中证明用户的身份。

  2. 授权访问:当用户通过身份验证后,服务器可以颁发一个访问令牌给用户。这个令牌用于证明用户被授予了特定的权限或访问特定资源的权利。用户在后续请求中使用该令牌来访问受保护的资源,服务器会验证令牌的有效性和权限。

  3. API 访问:在应用程序开发中,API 令牌通常用于授权第三方应用程序或服务来访问特定的 API。开发者向 API 提供商注册应用程序,并获得一个 API 令牌,以便在应用程序中进行身份验证和授权,以访问和使用 API 提供的功能和数据。

简单来说,就是本次登录的一个凭证,只要你带着服务器端返回来的token你就可以访问当前相对应的内容(具体还需要服务端来定)。

二、JTW

token本身就是一个加密字符串,但是由自己生成需要考虑到安全性、加密算法等,但我们可以使用插件 例如jsonwebtoken就可以帮助我们token并验证。

安装jsonwebtoken

npm install jsonwebtoken

生成token 

语法:JWT.sign(数据,加密字符串, 时间)  

const JWT = require("../../utils/JWT.js")let token = JWT.sign({ username:'奥特曼',id:123 },'secret', '1day')

验证token 

语法:jwt.verify(生成的token,加密字符串)

jwt.verify(token,'secret')

三、实践

 封装


const jwt = require('jsonwebtoken')
const secret = "ultraman"//解密密钥const JWT = {createToken: (data,time) => { return jwt.sign(data,secret,{expiresIn:time})},verifyToken: (token) => { // 如果token过期或验证失败,将返回falsetry {return jwt.verify(token,secret)} catch (error) {return false}}
}module.exports = JWT

登录接口

 login: async (req, res, next) => { var result = await UserService.login(req.body)if (result.length) {// 生成tokenconst DeepRes = JSON.parse(JSON.stringify(result[0])) delete DeepRes.passwordlet token = JWT.createToken({ username: req.body.username,id:result[0]._id }, '1day')res.header('Authorization', token)res.send({code:200,msg:'登录成功',data:{token,userInfo:DeepRes}})} else {res.send({code:500,msg:'账号或密码错误'})}console.log(result,'登陆了');},

验证拦截

验证中用了截取,采用了Bearer  xxxx 的形式,所以做了截取只保留token部分进行验证。

app.use((req, res, next) => {  if (whiteList.includes(req.path)) return next()let token = req.get('Authorization')if (token) {const result = JWT.verifyToken(token.split(' ')[1])if (result) {next()} else {res.status(401).send({ code: 401, msg: '登录信息已失效,请重新登录' })}} else { res.send({ code: 500, msg: '未携带token' })}})

验证后会把数据返回出来,就可以当时生成token传过去的数据,有了数据那么我们就可以自行获取用户信息

token获取个人信息

  getUserInfo: async (req, res, next) => { let token = req.get('Authorization')const info = JWT.verifyToken(token.split(' ')[1])const userInfo =  await UserService.getProfile(info.id)console.log(userInfo, 'userInfo');res.send({code:200,msg:'获取成功',data:{userInfo:userInfo[0]}})}

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(Python)Requests+Pytest+Allure接口自动化测试框架从0到1搭建

前言:本文主要介绍在企业使用Python搭建接口自动化测试框架,数据驱动读取excel表里的数据,和数据库方面的交互,包括关系型数据库Mysql和非关系型数据库MongDB,连接数据库,读取数据库中数据,最后…

云原生可观测框架 OpenTelemetry 基础知识(架构/分布式追踪/指标/日志/采样/收集器)...

什么是 OpenTelemetry? OpenTelemetry 是一个开源的可观测性框架,由云原生基金会(CNCF)托管。它是 OpenCensus 和 OpenTracing 项目的合并。旨在为所有类型的可观测信号(如跟踪、指标和日志)提供单一标准。 https://opentelemetry.iohttps://www.cncf.io…

Java课题笔记~ Servlet编程

1.Servlet编程基础 (1)什么是Servlet Servlet是基于Java语言的Web编程技术,部署在服务器端的Web容器里,获取客户端的访问请求,并根据请求生成响应信息返回给客户端。 创建Servlet的方式,有 如下图:一般创建Servlet都…

交流有效值,峰值和平均值关系

1,交流有效值,峰值和平均值关系: 2,根据负载,确定变压器满载时的输出电压: 1),为了使稳压芯片MIC29302输出4V,LDO压差 0.4V,整流桥压降为1V, 则…

web-初始前端

不区分大小写&#xff0c;单双引号&#xff0c; <html><head><title>初识HTML</title></head><body><h1>Hello world!</h1><img src OIF-C.jfif/></body> </html> <!-- 文件格式 --> <!DOCTYPE h…

第二课-一键安装SD-Stable Diffusion 教程

前言 看完这篇文章并跟着操作,就可以在本地开始 SD 绘图了。 理论上来说,这篇课程结束,想要画什么图都可以画了。 启动器介绍 SD 是开源的,可以在 github 上找到。但直接下载源码安装,非常费劲,而且因为国内外差异,就是我这样的秃头程序员也难以应对。 所以,我们改…

面试攻略,Java 基础面试 100 问(二)

五大基本原则 单一职责原则SRP(Single Responsibility Principle) 是指一个类的功能要单一&#xff0c;不能包罗万象。如同一个人一样&#xff0c;分配的工作不能太多&#xff0c;否则一天到晚虽然忙忙碌碌的&#xff0c;但效率却高不起来。 开放封闭原则OCP(Open&#xff0…

uniapp实现自定义导航内容高度居中(兼容APP端以及小程序端与胶囊对齐)

①效果图如下 1.小程序端与胶囊对齐 2.APP端内容区域居中 注意&#xff1a;上面使用的是colorui里面的自定义导航样式。 ②思路&#xff1a; 1.APP端和小程序端走不同的方法&#xff0c;因为小程序端要计算不同屏幕下右侧胶囊的高度。 2.其次最重要的要清晰App端和小程序端…

Unity游戏源码分享-儿童益智数学大脑训练游戏

Unity游戏源码分享-儿童益智数学大脑训练游戏 5秒内选择答案 项目下载地址&#xff1a;https://download.csdn.net/download/Highning0007/88198773

[RoarCTF 2019Online Proxy]sql巧妙盲注

文章目录 [RoarCTF 2019Online Proxy]sql巧妙盲注解题脚本脚本解析 [RoarCTF 2019Online Proxy]sql巧妙盲注 解题 在源代码界面发现&#xff1a;Current Ip 我们会联想到&#xff1a;X-Forwarded-For来修改ip&#xff1a; 结果我们发现&#xff0c;response会讲Last Ip回显出…

成集云 | 畅捷通采购单同步至钉钉 | 解决方案

源系统成集云目标系统 介绍 畅捷通是一家专业的金融科技公司&#xff0c;致力于为投资者提供便捷、高效的金融服务。通过畅捷通T的交易方式&#xff0c;投资者可以更加灵活地进行买卖交易&#xff0c;并且在交易完成后即可获得结算款项&#xff0c;无需等待T1的结算周期。 钉…

Webpack怎么使用?

Webpack 使用 前几篇文章中已经介绍了如何初始化包管理器 package.json 这里不再重复介绍&#xff0c;如有需要请查看 搭建工程化项目。 安装 :::warning 注意 请确保你已经安装了 yarn&#xff0c;如有需要请查看 搭建工程化开发环境。 ::: 通过命令 yarn add webpack web…

大数据技术之Hadoop:HDFS集群安装篇(三)

目录 分布式文件系统HDFS安装篇 一、为什么海量数据需要分布式存储 二、 分布式的基础架构分析 三、 HDFS的基础架构 四 HDFS集群环境部署 4.1 下载安装包 4.2 集群规划 4.3 上传解压 4.4 配置HDFS集群 4.5 准备数据目录 4.6 分发hadoop到其他服务器 4.7 配置环境变…

实例033 制作闪烁的窗体

实例说明 Windows系统中&#xff0c;当程序在后台运行时&#xff0c;如果某个窗口的提示信息需要用户浏览&#xff0c;该窗口就会不停的闪烁&#xff0c;这样就会吸引用户的注意。同样&#xff0c;如果在自己的程序中使某个窗口不停的闪烁就会吸引用户的注意。本例设计了一个闪…

设计模式之工厂模式

简单工厂 由一个工厂生产多个产品。 一般工厂 每个产品都有一个单独的工厂专门生产。 抽象工厂 不同工厂生产不同种类的产品&#xff0c;每个工厂生产的同类产品又可以再次分类。比如一个鼠标工厂和一个键盘工厂&#xff0c;他们可以为不同的品牌生产鼠标和键盘。

手写SpringCloud系列-一分钟理解微服务注册中心(Nacos)原理。

手写SpringCLoud项目地址&#xff0c;求个star github:https://github.com/huangjianguo2000/spring-cloud-lightweight gitee:https://gitee.com/huangjianguo2000/spring-cloud-lightweigh 一&#xff1a;什么是注册中心 1. 总结服务注册中心 我们可以理解注册中心就是一个…

Mermaid语法使用

Mermaid语法使用 1. 基础类1.1 流程图1.2 时序图 2. 工程图2.1 类图2.2 Git图 1. 基础类 1.1 流程图 graph TBid1(圆角矩形)--普通线-->id2[矩形];subgraph 子图id2粗线>id3{菱形}id3-. 虚线.->id4>右向旗帜]id3--无箭头---id5((圆形))end方向定义 用词含义TB从…

[OnWork.Tools]系列 05-系统工具

简介 系统工具主要是将Window常用工具的快捷启动的集合 双击快速启动 计算器,记事本,截图,画图工具 控制面板,服务管理,关闭显示器,关机 启动文件夹,我的电脑,管理工具 右键菜单 添加快捷方式到桌面

通过anvt X6和vue3实现图编辑

通过anvt X6 X6地址&#xff1a;https://x6.antv.antgroup.com/tutorial/about&#xff1b; 由于节点比较复杂&#xff0c;使用vue实现的节点&#xff1b; x6提供了一个独立的包 antv/x6-vue-shape 来使用 Vue 组件渲染节点。 VUE3的案例&#xff1a; <template><div…

基于Python 简易实现接口测试自动化

目录 实现思路 统筹脚本 请求封装 日志封装 结果比对 结果邮件 用例获取及数据格式化 请求url转换 测试用例excel结构 测试报告 邮件接收结果 资料获取方法 实现思路 使用excel管理用例用例信息&#xff0c;requests模块发送http请求&#xff0c;实现了记录日志&…