当前位置: 首页 > news >正文

在Gin框架中实现Token令牌认证

什么是token

用户登录成功后,后续操作若需要用户的账号之类的信息一直让前端传递数据这种操作是不安全的,这个时候只需要用户登陆成功之后后端返回一串加密的字符串(token),由前端配置在Header中,这样又安全还能完美的解决问题。下面是生成token,验证token的步骤。

"github.com/dgrijalva/jwt-go" 使用的库

一、定义一个Token结构体

作者的项目token里包含了用户的账号密码及角色,大家按需来定义

// Claims Token结构体
type Claims struct {Username string `json:"username"`//账号Password string `json:"password"`//密码Role     string `json:"role"`//角色jwt.StandardClaims          //内置结构体,包含token令牌本身的信息
}

二、定义密钥+生成密钥

我定义的密钥长度为七

// 定义密钥
var JwtKey = []byte("xlszxjm") //首字母大写,另一个文件中验证方法可以调用
// ReleaseToken 生成密钥
func ReleaseToken(username, password, role string) (string, error) {expirationTime := time.Now().Add(7 * 24 * time.Hour) //token的有效期是七天claims := &Claims{Username: username,Password: password,Role:     role,StandardClaims: jwt.StandardClaims{ExpiresAt: expirationTime.Unix(), //token的有效期IssuedAt:  time.Now().Unix(),     //token发放的时间Issuer:    "xxx",                 //作者(可修改)Subject:   "user token",          //主题},}token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)tokenString, err := token.SignedString(JwtKey) //根据前面自定义的Jwt秘钥生成tokentokenString = "Bearer " + tokenStringif err != nil {//返回生成的错误return "", err}//返回成功生成的字符换return tokenString, nil
}

三、解析token

// ParseToken 解析从前端获取到的token值
func ParseToken(tokenString string) (*jwt.Token, *Claims, error) {claims := &Claims{}token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) {return JwtKey, nil})return token, claims, err
}

四、验证token是否合法的中间件

func AuthMiddleware() gin.HandlerFunc {return func(c *gin.Context) {// 获取前端传过来的信息tokenString := c.GetHeader("token")//验证前端传过来的token格式,不为空,开头为Bearerif tokenString == "" || !strings.HasPrefix(tokenString, "Bearer ") {response.ResponseError(c, 400)c.Abort()return}//验证通过,提取有效部分(除去Bearer)tokenString = tokenString[7:] //截取字符//解析tokentoken, _, err := ParseToken(tokenString)//使用解析token的方法//解析失败||解析后的token无效if err != nil || !token.Valid {response.ResponseError(c, 400)c.Abort()return}c.Next()}
}

五、通过token获取用户信息

// GetUsername 通过token获取username
func GetUsername(tokenString string) (string, error) {tokenString = tokenString[7:]token, _, err := ParseToken(tokenString)if err != nil {fmt.Println("GetUsername  ParseToken() err:", err.Error())return "", err}if claims, ok := token.Claims.(*Claims); ok {return claims.Username, nil}return "", nil
}// GetRole 通过token获取role
func GetRole(tokenString string) (string, error) {tokenString = tokenString[7:]token, _, err := ParseToken(tokenString)if err != nil {fmt.Println("GetRole ParseToken() err:", err)return "", err}if claims, ok := token.Claims.(*Claims); ok {return claims.Role, nil}return "", err
}

最后,只需要在用户登录的接口调用生成token的方法,将生成的token返回给前端并配置在Header中,把中间件添加在需要使用到c.GetHeader("token")方法的接口前以防止前端因配置失败出现错误。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • CSS的盒子模型(Box Model)
  • 2024百度的组织架构和产品分布
  • SegFormer网络结构的学习和重构
  • LCR 029
  • [Web安全 网络安全]-CSRF跨站请求伪造
  • 面试经典 150 题:力扣88. 合并两个有序数组
  • 普通本科生也能成为AI高手:人工智能学习指南
  • 嵌入式 开发技巧和经验分享
  • 桌面专业版【修改主机名和更改计算机显示名称】方法介绍
  • Go语言Mutex的优化与TryLock机制解析
  • 微信小程序-使用vant组件库
  • 音视频入门基础:FLV专题(4)——使用flvAnalyser工具分析FLV文件
  • 9/24作业
  • 性能测试1初步使用Jmeter
  • 海平面气压与气柱平均温度的计算及其在气象学中的应用
  • python3.6+scrapy+mysql 爬虫实战
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • Angular数据绑定机制
  • C++入门教程(10):for 语句
  • download使用浅析
  • eclipse的离线汉化
  • KMP算法及优化
  • MySQL数据库运维之数据恢复
  • ng6--错误信息小结(持续更新)
  • nginx 配置多 域名 + 多 https
  • React Native移动开发实战-3-实现页面间的数据传递
  • Yii源码解读-服务定位器(Service Locator)
  • 对JS继承的一点思考
  • 多线程事务回滚
  • 浮现式设计
  • 消息队列系列二(IOT中消息队列的应用)
  • 用jQuery怎么做到前后端分离
  • 智能合约Solidity教程-事件和日志(一)
  • 最近的计划
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #HarmonyOS:Web组件的使用
  • ( 10 )MySQL中的外键
  • (1)Android开发优化---------UI优化
  • (3)nginx 配置(nginx.conf)
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (WSI分类)WSI分类文献小综述 2024
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (论文阅读30/100)Convolutional Pose Machines
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (三)uboot源码分析
  • (顺序)容器的好伴侣 --- 容器适配器
  • (转)fock函数详解
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • ****三次握手和四次挥手
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别