golang 中 Jwt 的验证及续期使用

news/2024/7/8 0:56:26/文章来源:https://www.cnblogs.com/yingger/p/18284466

创建Utils的Jwt文件,用于创建Jwt Token  和    验证并继期

package utilsimport ("errors""fmt""github.com/dgrijalva/jwt-go""strings""time"
)// 生成Jwt Token
// @Param  secretKey 表示jwt secretKey【*******注意:发布多台时secretKey 必须一样*********】
// @Result  string 创建的Token
// @Result  error 返回验证错误信息func GenerateJWTToken() (string, error) {// secretKey 表示jwt 的secretKey【*******注意:发布多台时secretKey 必须一样,否则通不过验证*********】// 获取 ini 文件配置的 Jwt SecretKeyvar secretKey = GetIniVale("jwt", "SecretKey")claims := jwt.MapClaims{"sub":  "1234567890","name": "John Doe","iat":  time.Now().Unix(),"exp":  time.Now().Add(time.Minute * 3).Unix(),}// 使用指定的签名方法和密钥创建令牌token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)tokenString, err := token.SignedString([]byte(secretKey))if err != nil {return "", err}return tokenString, nil
}// 验证Jwt token  并且如果Token快过期,就创建新的token
// @Param  tokenString 表示jwt token
// @Result  bool 验证是否通过
// @Result  string 快过期创建新的Token,没有则为空
// @Result  error 返回验证错误信息func ValidateJWTToken(tokenString string) (bool, string, error) {// secretKey 表示jwt 的secretKey【*******注意:发布多台时secretKey 必须一样,否则通不过验证*********】// 获取 ini 文件配置的 Jwt SecretKeyvar secretKey = GetIniVale("jwt", "SecretKey")tokenString = strings.TrimPrefix(tokenString, "Bearer ")token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {return []byte(secretKey), nil})if err != nil {return false, "", err}claims, ok := token.Claims.(jwt.MapClaims)// token 验证if ok && token.Valid {// Token是否过期if !claims.VerifyExpiresAt(time.Now().Unix(), false) {return false, "", errors.New("access token expired")}// 一分钟过期就重新添加一个Token 返回给前端if !claims.VerifyExpiresAt(time.Now().Add(time.Minute).Unix(), false) {newToken, _ := GenerateJWTToken()return true, newToken, nil}return true, "", nil} else {return false, "", fmt.Errorf("Invalid token")}
}

编写登录创建jwt token

package controllerimport ("github.com/gin-gonic/gin""jwt/utils"
)type UserController struct{}func (u UserController) Login(c *gin.Context) {userName := c.Query("userName")pwd := c.Query("password")if userName == "zs" && pwd == "123" {// 登录成功  生成Jwt Tokentoken, err := utils.GenerateJWTToken()if err != nil {c.JSON(500, gin.H{"Msg": "生成Token失败:" + err.Error()})} else {c.JSON(200, gin.H{"Token": token})}} else {c.JSON(500, gin.H{"Msg": "用户中或密码错误!"})}
}

在gin 中 添加中间件,用于验证 token

package middlewareimport ("github.com/gin-gonic/gin""jwt/utils""strings"
)func ValidataToken() gin.HandlerFunc {return func(c *gin.Context) {if strings.Contains(strings.ToLower(c.Request.RequestURI), "/user/login") {c.Next()} else {token := c.GetHeader("Authorization")// 验证token  并且如果 Token快过期 就创建新的tokenbls, newToken, err := utils.ValidateJWTToken(token)if err != nil {c.JSON(500, gin.H{"msg": err.Error(),})c.Abort()return} else {if bls {// 是否有快过期创建新的Tokenif len(newToken) > 0 {c.Header("newToken", newToken) // 将新Token添加到返回的Header里
                    }c.Next()} else {c.JSON(401, gin.H{"msg": "token not validated"})c.Abort()return}}}}
}

gin 中use中间件

package mainimport ("github.com/gin-gonic/gin""jwt/middleware""jwt/route"
)func main() {r := gin.Default()  r.Use(middleware.ValidataToken())route.AddUserInfoRoute(r)r.Run(":8080")
}

 

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

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

相关文章

flutter状态管理 provider使用

provider是flutter官方推荐的状态管理插件,是基于InheritedWidget实现的。 下面我们来讲一个provider的使用方法。 1.在pubspec.yaml文件中添加 provider: ^6.1.2 开发文档:https://pub-web.flutter-io.cn/packages/provider 可以查看使用方法和最新版本号。 添加完成后…

企业数字化转型:顶层规划方法

随着数字化时代的到来,发生了以数字化、智能化为典型特征的新一轮科技革命,各行各业利用互联网、大数据、云计算、人工智能、区块链技术对传统产业进行全方位、全链条改造,实施“上云用数赋智”行动,全面推进各行业数字化转型。数字经济的大门已然开启,数字经济顶层战略规…

Nuxt3 的生命周期和钩子函数(十)

摘要:本文详细介绍了Nuxt3框架中的五个webpack钩子函数:webpack:configResolved用于在webpack配置解析后读取和修改配置;webpack:compile在编译开始前调用,可修改编译选项;webpack:compiled在编译完成后调用,可处理编译结果;webpack:change在开发模式下文件变化时触发,…

Jenkins汉化

1、Jenkins版本:版本2.426.3) Manage Jenkins->选择Plugins->切换到Availabled plugin->搜索local,然后选中安装,如下图所示 2、安装完成后重启Jenkins,汉化完成。如下图所示 像个小学生一样努力学习

模拟集成电路设计系列博客——9.1 比较器

模拟集成电路设计 9.1 比较器 比较器可能是继放大器之后第二常用的电路元件,比较器用于判断一个信号是否大于或小于零,或者比较一个信号是否大于另一个。如我们之前的章节所见,比较器在ADC中非常常用。在其他的应用中也经常出现比较器,例如数据传输,开关电源稳压器等等。 …

prufer序列

prufer序列用途: 将带标号的树用唯一的整数序列表示出来,证明凯莱公式。构造方法:每次选择一个编号最小的叶结点并删掉它,然后在序列中记录下它连接到的那个结点。重复\(n-2\)次后就只剩下两个结点,算法结束。 举个栗子(本图来自baoziwu2,侵删)显然可以有一个用堆做的方法,…

【冷启动#2】实用的springboot tutorial入门demo

跟着官方文档熟悉一遍创建spring工程的步骤 https://spring.io/guides/gs/spring-boot https://juejin.cn/post/7077958723829760008 demo简介 整个demo的预期目标是: 管理一堆玩家的数据,数据库使用的是现成的我们虚拟机上安装的MySQL 项目结构参考 主要工作:创建并熟悉spr…

CentOS8部署zerotier异地组网

本文介绍了在CentOS 8系统上部署ZeroTier以实现异地组网的方法,包括安装、配置、加入网络、开启IP转发和设置路由表等步骤,并提出进一步实现公网无缝组网的展望。CentOS8部署zerotier异地组网 CentOS8部署zerotier异地组网 一、前言 本文在此前研究部署FRP进行内网穿透,但FR…

《DNK210使用指南 -CanMV版 V1.0》第九章 打印输出实验

第九章 打印输出实验 1)实验平台:正点原子DNK210开发板 2)章节摘自【正点原子】DNK210使用指南 - CanMV版 V1.0 3)购买链接:https://detail.tmall.com/item.htm?&id=782801398750 4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/ATK-DN…

分享一款可编辑本地电脑文件的在线编辑器

之前见过在线版的VSCode,被惊讶到了。网页上竟然可以编辑电脑本地的文件,打破了网页无法编辑本地电脑文件的限制。一直好奇怎么做的。抽空研究了一下,然后发现其实也不难。背景 之前见过在线版的VSCode,被惊讶到了。网页上竟然可以编辑电脑本地的文件,打破了网页无法编辑本…

xhcms

xhcms 目录结构 admin --管理后台文件夹 css --存放css的文件夹 files --存放页面的文件夹 images --存放图片的文件夹 inc --存放网站配置文件的文件夹 install --网站进行安装的文件夹 seacmseditor --编辑器文件夹 templ…

lrzsz安装完成后rz乱码

rz选择文件夹后乱码传输不到linux里面, 这时候只需要rz -be再选择文件 这样就可以进行后续的解压了tar -zxvf jdk-8u65-linux-x64.tar.gz

椭流线法设计配光器

本文介绍了利用椭流线法设计高效均匀的LED配光器,通过对边光原理、反射定律及椭圆几何特性的深入分析,结合Matlab和SolidWorks软件实现光学仿真,最终成功设计出接收效率高、均匀度优的配光器。椭流线法设计配光器 椭流线法设计配光器 一、设计原理 1、边光原理 边光原理是非…

wx云开发增删改查

首先是.wxml文件,此处为固定数据的新增<button type="primary" bind:tap="addData"> //调用.js中addData方法插入数据 </button>对应.js文件//添加数据addData(){wx.showLoading({ //showLoading(api接口)(防止用户多次…

剪裁法设计配光器

剪裁法设计配光器通过光源角分割和目标面分割,利用边光原理和反射定律,计算并构建光学母线,以实现高均匀度和高光效的均匀圆斑光学设计。剪裁法设计配光器 剪裁法设计配光器 一、设计原理边光原理 边光原理是非成像光学中的一个基础原理,其内容可以表述为:来自光源边缘的光…

iOS-列表视图

在iOS开发中,UITableView和UICollectionView是两个非常核心的用于展示集合数据的UI组件。它们都能以列表的形式展示数据,但各自的特点和使用场景有所不同。 UITableView UITableView用于展示和管理垂直滚动的单列数据列表。它是以行的形式展示数据,每行(cell)可以展示相同…

CPC配光系统设计

本文详细介绍了CPC(复合抛物线聚光器)配光系统的设计过程,包括设计原理、抛物流线几何特性及其设计要求和流程,并通过Matlab和SolidWorks绘制模型,最后在TracePro中进行仿真验证,确保系统满足均匀照度和高效接收率的目标。CPC配光系统设计 CPC配光系统设计 一、设计原理 …

VMware vSphere Tanzu部署_14_部署容器应用

1.部署运行容器应用 1.1. 登录tkc集群 jianhua@napp:~/tkc$ kubectl vsphere login --server=192.168.203.194 \ --tanzu-kubernetes-cluster-name tkc-dev-cluster \ --tanzu-kubernetes-cluster-namespace tkc-01 \ --vsphere-username administrator@vsphere.local \ --ins…

贝塞尔曲线原理、推导及Matlab实现

本文详细解析了贝塞尔曲线的定义、性质、构建方法以及多种阶数的推导公式,并提供了完整的Matlab代码用于绘制和计算贝塞尔曲线。贝塞尔曲线原理、推导及Matlab实现 贝塞尔曲线原理、推导及Matlab实现 一、简介 贝塞尔曲线提出 在数学的数值分析领域中,贝塞尔曲线(English:B…

刘积仁的大健康“长跑”

软件是一个长命的产业,但软件企业的寿命都很短。懂得怕死,才能有机会活得长久。 这一次,刘积仁又为东软医疗找到了强大助力!中国通用技术(集团)控股有限责任公司(以下简称通用技术集团)所属资本公司战略投资东软集团在医疗健康领域资的创新业务公司——东软医疗,双方也由…