Go-JWT完整示例

依赖安装

go get -u github.com/golang-jwt/jwt/v5

文档地址

文档

创建对象

jwt的相关配置

# jwt configuration
jwt:signing-key: xxxexpires-time: 7dbuffer-time: 1dissuer: fancy_fishclaim-strings: fancy_fish_to_do_list

claims类型配置

package requestimport ("github.com/golang-jwt/jwt/v5""github.com/google/uuid"
)type BaseClaims struct {UUID     uuid.UUIDUsername stringjwt.RegisteredClaims
}type CustomClaims struct {BaseClaimsBufferTime int64jwt.RegisteredClaims
}

代码示例

package utilimport ("ToDoList/enum""ToDoList/global""ToDoList/model/request""fmt""github.com/gin-gonic/gin"jwt "github.com/golang-jwt/jwt/v5""net""time"
)type _jwt struct {SigningKey []byteClaims     jwt.Claims
}
// 解析token 验证是否有效
func (receiver *_jwt) ValidateToken(tokenString string) (*request.CustomClaims, error) {token, err := jwt.ParseWithClaims(tokenString, &request.CustomClaims{}, func(token *jwt.Token) (i interface{}, e error) {return receiver.SigningKey, nil})if err != nil {fmt.Println(err, "token验证错误")return nil, err}if token != nil {if claims, ok := token.Claims.(*request.CustomClaims); ok && token.Valid {return claims, nil}return nil, enum.TokenInvalid} else {return nil, enum.TokenInvalid}
}func (receiver *_jwt) CreateToken(claims request.CustomClaims) (string, error) {t := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)token, err := t.SignedString(receiver.SigningKey)if err != nil {fmt.Println("toen生成失败")return token, err}return token, nil
}// 创建生成token必须的clasims
func (receiver *_jwt) CreateClaims(baseClaims request.BaseClaims) request.CustomClaims {// 按天解析,time.ParseDuration()不支持按天。bft, _ := BasicUtils.ParseDuration(global.GVA_CONFIG.JWT.BufferTime)ept, _ := BasicUtils.ParseDuration(global.GVA_CONFIG.JWT.ExpiresTime)claims := request.CustomClaims{BaseClaims: baseClaims,BufferTime: int64(bft / time.Second), // 缓冲时间1天 缓冲时间内会获得新的token刷新令牌 此时一个用户会存在两个有效令牌 但是前端只留一个 另一个会丢失RegisteredClaims: jwt.RegisteredClaims{Audience:  jwt.ClaimStrings{global.GVA_CONFIG.JWT.ClaimStrings}, // 受众NotBefore: jwt.NewNumericDate(time.Now().Add(-1000)),            // 签名生效时间ExpiresAt: jwt.NewNumericDate(time.Now().Add(ept)),              // 过期时间 7天  配置文件Issuer:    global.GVA_CONFIG.JWT.Issuer,                         // 签名的发行者},}return claims
}func JWTNew() *_jwt {return &_jwt{SigningKey: []byte(global.GVA_CONFIG.JWT.SigningKey),}
}var JWTToken = JWTNew()func SetToken(c *gin.Context, token string, maxAge int) {// 增加cookie x-token 向来源的web添加host, _, err := net.SplitHostPort(c.Request.Host)if err != nil {host = c.Request.Host}if net.ParseIP(host) != nil {c.SetCookie("x-token", token, maxAge, "/", "", false, false)} else {c.SetCookie("x-token", token, maxAge, "/", host, false, false)}
}func GetToken(c *gin.Context) string {token, _ := c.Cookie("x-token")if token == "" {token = c.Request.Header.Get("x-token")}return token
}

按天解析时间

func (receiver basicUtils) ParseDuration(d string) (time.Duration, error) {d = strings.TrimSpace(d)dr, err := time.ParseDuration(d)if err == nil {return dr, nil}if strings.Contains(d, "d") {index := strings.Index(d, "d")hour, _ := strconv.Atoi(d[:index])dr = time.Hour * 24 * time.Duration(hour)ndr, err := time.ParseDuration(d[index+1:])if err != nil {return dr, nil}return dr + ndr, nil}dv, err := strconv.ParseInt(d, 10, 64)return time.Duration(dv), err
}

生成token

	j := util.JWTNew()claims := j.CreateClaims(request.BaseClaims{UUID:     u.UUID,Username: u.Username,})token, err := j.CreateToken(claims)

总结

Token的组成成分

  1. 秘钥这个自定义一个字符串即可
  2. 声明名称的列表可以将用户名或 ID 或角色编码到令牌中,也可以称为载荷
  3. 签名算法
    关键函数的签名
    func NewWithClaims(method SigningMethod, claims Claims, opts ...TokenOption) *Token

JWT-GO使用主要有以下步骤

  1. 配置私钥
  2. NewWithClaims传入方法和声明
  3. 通过SignedString创建token
  4. ParseWithClaims传入token解析token

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

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

相关文章

【m122】webrtc的比较

uint16的比较IsNewerSequenceNumber 和 u32的比较LatestTimestamp G:\CDN\WEBRTC-DEV\libwebrtc_build\src\modules\include\module_common_types_public.h/** Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.** Use of this source code is governed …

Node.js中Router的使用

文章目录 介绍router的优点1.导入Express和创建Router:2. 定义路由:3.将router暴露到模块外:4. 将Router挂载到Express应用中:4.1.引入router4.2.使用中间件让router在Express应用中生效(三种写法) 5. 完整示例:5.1.编…

面试题:Spring Boot应用的打包部署方式(jar/war、内嵌服务器)

Spring Boot应用的打包部署方式主要有两种: jar 和 war ,分别对应不同的部署场景和需求。 ### 1. 打包成 JAR 包部署 #### JAR (Java Archive) 方式 Spring Boot的一个核心特性就是其内嵌服务器(默认是Tomcat,也可更换为J…

【Web】NSSCTF Round#20 Basic 两道0解题的赛后谈

目录 前言 baby-Codeigniter 组合拳! 前言 本想着说看看go的gin框架就睡了的,r3师傅提醒说赛题环境已经上了,那不赶紧研究下😀 主要来谈谈做题的心路历程 baby-Codeigniter 拿到题目的第一反应应该是:“什么是C…

jmeter性能压测的标准和实战中会遇到的问题

1.性能标准建议 CPU 使用率:不超过 70% 内存使用率:不超过 70% 磁盘:%util到达80%严重繁忙 (os.disIO.filesystem.writeKbPS 每秒写入的千字节) 响应时间:95%的响应时间不超过8000ms 事务成功率&#xff1a…

pytest中文使用文档----6临时目录和文件

1. 相关的fixture 1.1. tmp_path1.2. tmp_path_factory1.3. tmpdir1.4. tmpdir_factory1.5. 区别 2. 默认的基本临时目录 1. 相关的fixture 1.1. tmp_path tmp_path是一个用例级别的fixture,其作用是返回一个唯一的临时目录对象(pathlib.Path&#xf…

阿里云2核4G服务器租用价格_30元3个月_165元一年_199元

阿里云2核4G服务器租用优惠价格,轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月,活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图: 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

PCL点云处理之 基于垂直度检测与距离聚类 的路面点云提取方案 (二百三十九)

PCL点云处理之 基于垂直度检测与距离聚类 的路面点云提取方案 (二百三十九) 一、算法流程二、具体步骤1.垂直度检测与渲染1.代码2.效果2.水平分布点云提取1.代码2.效果3.路面连通点云提取1.代码2.效果三、完整代码四、参考文献一、算法流程

Chapter 1 - 6. Introduction to Congestion in Storage Networks

NVMe/TCP NVMe/TCP carries NVMe commands over TCP transport (Figure 1-8) for accessing remote block storage via a lossy or sometimes lossless network. It is an OSI layer 5 (sessions layer) protocol. NVMe/TCP 通过 TCP 传输(图 1-8)传输 NVMe 命令,以便通过有…

Flutter 开发学习笔记(2):第一个简单的Flutter项目(下)

文章目录 前言官方Flutter案例侧边栏添加代码初始化展示效果 子组件私有数据空间导航栏转为有状态WidgetsetState手动转换页面实现效果 响应式动态切换宽度添加收藏夹,跨Widget传数据实现效果 完整代码后续进阶效果总结 前言 接着继续上一章的内容 官方Flutter案例…

简单了解策略模式

什么是策略模式? 策略模式提供生成某一种产品的不同方式 Strategy策略类定义了某个各种算法的公共方法,不同的算法类通过继承Strategy策略类,实现自己的算法 Context的作用是减少客户端和Strategy策略类之间的耦合,客户端只需要…

react hook 为循环出来的多个子组件添加ref

react hook 为循环出来的多个子组件添加ref 在React函数组件中,可以使用useRef钩子来获取当前组件的标签(DOM元素)。 父组件 const details useState([{name:A},{name:B},{name:C}])const bodyRefs useRef({});// 把ref挂载在循环出来的子组…

UE4 面试题整理

1、new与malloc的区别 new: new首先会去调用operator new函数,申请足够的内存(大多数底层用malloc实现),然后调用类型的构造函数来初始化变量,最后返回自定义类型的指针,delete先调用析构函数&…

设计模式之装饰模式精讲

概念:动态地给一个对象添加一些额外的职责。 装饰器模式侧重于在不改变接口的前提下动态地给对象添加新功能,保持对象结构的透明性,客户端无感知。 以一个咖啡制作和装饰的例子来帮助大家理解: public interface Coffee {double…

QT-自定义参数设计框架软件

QT-自定义参数设计框架软件 前言一、演示效果二、使用步骤1.应用进行参数注册2.数据库操作单例对象3.参数操作单例对象 三、下载链接 前言 常用本地数据参数通常使用的是xml等文本的格式,进行本地的数据参数的存储。这种参数的保存方式有个致命的一点,就…

YOLOv9改进策略 :主干优化 | ConvNeXtV2:适应自监督学习,让 CNN “再一次强大”?

💡💡💡本文改进内容:完全卷积掩码自编码器框架 ConvNeXt V2,它显著提高了纯convnet在各种识别基准上的性能,包括ImageNet分类,COCO目标检测和ADE20k分割。还提供了各种尺寸的预训练ConvNeXt v2模型,从而在ImageNet上具有76.7%精度的3.7M Atto model和88.9%精度的650…

zabbix主动发现,注册及分布式监控

主动发现 结果 主动注册 结果 分布式监控 服务机:132 代理机:133 客户端:135 代理机 数据库赋权: 代理机配置 网页上配置代理 客户端配置 网页上配置主机 重启代理机服务 网页效果

排序第五篇 归并排序

一 简介 归并排序(Merge Sort) 的基本思想是: 首先将待排序文件看成 n n n 个长度为1的有序子文件, 把这些子文件两两归并, 得到 n 2 \frac{n}{2} 2n​ 个长度为 2 的有序子文件; 然后再把这 n 2 \frac{n}{2} 2n​ 个有序的子…

PostCSS及其常用插件介绍

PostCSS及其常用插件介绍 前几天,PostCSS 6.0 分布了。 PostCSS 处理了很多你不必处理的乏味工作。它很巧妙的不同于预处理器,提供了可选的且更简洁的编程语言,来编译成 CSS,如 Sass、Less 与 Stylus。得出这个结论的部分原因是…

基于Tampermonkey 实现自动答题和视频播放

目录 一、环境准备 二、下载Tampermonkey 三、安装脚本 四、启用脚本 一、环境准备 微软自带的 edge 浏览器(电脑端) 二、下载Tampermonkey 安装地址:Tampermonkey 篡改猴(油猴脚本) 下载完成会在浏览器拓展中自动生成一个插件,此时点击管理拓展&…