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

devtools/2024/10/18 7:46:12/

什么是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")方法的接口前以防止前端因配置失败出现错误。


http://www.ppmy.cn/devtools/119593.html

相关文章

贪心算法介绍

贪心算法简介 与其说是贪心算法,不如说是贪心策略,解决问题的策略:从局部最优解推出全局最优解。 把解决问题的过程分为若干步在解决每一步的时候,都选择当前最优的解法希望得到全局最优解 例一:找零问题 我们手里…

Linux【基础指令汇总】

目录 Linux命令的特点 1、文件管理 ls命令 cp命令 mkdir命令 mv命令 pwd命令 2、文档编辑 cat命令 echo命令 rm命令 tail命令 rmdir命令 3、系统管理 rpm命令 find命令 startx命令 uname命令 vmstat命令 4、磁盘管理 df命令 fdisk命令 lsblk命令 hdpar…

【Ubuntu】DNS设置不生效/重启被重置

/etc/resolv.conf 是一个链接,指向/run/systemd/resolve/stub-resolv.conf , ubuntuVM-4-13-ubuntu:/run/systemd/resolve$ ll /etc/resolv.conf lrwxrwxrwx 1 root root 39 Sep 30 14:40 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.…

1、深入理解Redis线程模型

文章目录 一、Redis是什么?有什么用?1、Redis是什么?2、2024年的Redis是什么样的? 二、Redis到底是单线程还是多线程?三、Redis如何保证指令原子性1、复合指令2、Redis事务3、Pipeline4、lua脚本5、Redis Function6、R…

Spring系列 AOP实现过程

文章目录 实现原理EnableAspectJAutoProxyAnnotationAwareAspectJAutoProxyCreator 代理创建过程wrapIfNecessarygetAdvicesAndAdvisorsForBeanfindCandidateAdvisorsfindAdvisorsThatCanApply createProxy AspectJ注解处理代理调用过程 实现原理 本文源码基于spring-aop-5.3.…

针对GNU/Linux synology_apollolake_418play下的删除数据脚本

1、目的 一个在 Linux 下的 Bash 脚本,用于每三年删除 /volume1 目录下的文件以及子文件夹下的文件。这个脚本假设你已经有了判断时间间隔是否为三年的方法(比如上述提到的通过记录上一次执行时间并进行比较的方法)。 2、操作 1&#xff09…

Python从入门到高手4.1节-掌握条件控制语句

目录 4.1.1 理解条件控制 4.1.2 if, elif, else 4.1.3 条件表达式 4.1.4 条件控制可以嵌套 4.1.5 if语句的三元运算 4.1.6 国庆节快乐 4.1.1 理解条件控制 在日常生活中,我们常喜欢说如果, "如果怎么样,那么就会怎么样"。"如果&qu…

基于单片机的催眠电路控制系统

** 文章目录 前言一 概要功能设计设计思路 软件设计效果图 程序文章目录 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主…