golang中gin框架接入jwt如何使用token验证身份
发表于:2024-10-22 作者:千家信息网编辑
千家信息网最后更新 2024年10月22日,本篇内容介绍了"golang中gin框架接入jwt如何使用token验证身份"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔
千家信息网最后更新 2024年10月22日golang中gin框架接入jwt如何使用token验证身份jwt
流程:
1.token 工具类
2. 使用该中间件
3. controller部分代码
本篇内容介绍了"golang中gin框架接入jwt如何使用token验证身份"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
jwt
jwt的原理和session有点相像,其目的是为了解决rest api中无状态性
因为rest接口,需要权限校验。但是又不能每个请求都把用户名密码传入,因此产生了这个token的方法
流程:
用户访问auth接口,获取token
服务器校验用户传入的用户名密码等信息,确认无误后,产生一个token。这个token其实是类似于map的数据结构(jwt数据结构)中的key。
准确的应该是:token中其实就保存了用户的信息,只是被加密过了。怪不得服务器重启了token还能使用,就是这个原因,因为数据就是保存在token这条长长的字符串中的。
用户访问需要权限验证的接口,并传入token。
服务器验证token:根据自己的token密钥判断token是否正确(是否被别人篡改),正确后才从token中解析出token中的信息。可能会把解析出的信息保存在context中
1、这里使用开源的 jwt-go
1.token 工具类
package handlerimport ( "awesomeProject/utils" "github.com/dgrijalva/jwt-go" "github.com/gin-gonic/gin" "time")//用户信息类,作为生成token的参数type UserClaims struct { ID string `json:"userId"` Name string `json:"name"` Phone string `json:"phone"` //jwt-go提供的标准claim jwt.StandardClaims}var ( //自定义的token秘钥 secret = []byte("16849841325189456f487") //该路由下不校验token noVerify = []interface{}{"/login", "/ping"} //token有效时间(纳秒) effectTime = 2 * time.Hour)// 生成tokenfunc GenerateToken(claims *UserClaims) string { //设置token有效期,也可不设置有效期,采用redis的方式 // 1)将token存储在redis中,设置过期时间,token如没过期,则自动刷新redis过期时间, // 2)通过这种方式,可以很方便的为token续期,而且也可以实现长时间不登录的话,强制登录 //本例只是简单采用 设置token有效期的方式,只是提供了刷新token的方法,并没有做续期处理的逻辑 claims.ExpiresAt = time.Now().Add(effectTime).Unix() //生成token sign, err := jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString(secret) if err != nil { //这里因为项目接入了统一异常处理,所以使用panic并不会使程序终止,如不接入,可使用原始方式处理错误 //接入统一异常可参考 https://blog.csdn.net/u014155085/article/details/106733391 panic(err) } return sign}//验证tokenfunc JwtVerify(c *gin.Context) { //过滤是否验证token if utils.IsContainArr(noVerify, c.Request.RequestURI) { return } token := c.GetHeader("token") if token == "" { panic("token not exist !") } //验证token,并存储在请求中 c.Set("user", parseToken(token))}// 解析Tokenfunc parseToken(tokenString string) *UserClaims { //解析token token, err := jwt.ParseWithClaims(tokenString, &UserClaims{}, func(token *jwt.Token) (interface{}, error) { return secret, nil }) if err != nil { panic(err) } claims, ok := token.Claims.(*UserClaims) if !ok { panic("token is valid") } return claims}// 更新tokenfunc Refresh(tokenString string) string { jwt.TimeFunc = func() time.Time { return time.Unix(0, 0) } token, err := jwt.ParseWithClaims(tokenString, &UserClaims{}, func(token *jwt.Token) (interface{}, error) { return secret, nil }) if err != nil { panic(err) } claims, ok := token.Claims.(*UserClaims) if !ok { panic("token is valid") } jwt.TimeFunc = time.Now claims.StandardClaims.ExpiresAt = time.Now().Add(2 * time.Hour).Unix() return GenerateToken(claims)}
2. 使用该中间件
func main() { router := gin.Default() router.Use(handler.JwtVerify) router.GET("/ping", controller.Ping) router.GET("/login", controller.Login) router.GET("/userInfo", controller.UserInfo) router.Run(":8888") // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")}
3. controller部分代码
package controllerimport ( "awesomeProject/handler" "awesomeProject/utils" "github.com/dgrijalva/jwt-go" "github.com/gin-gonic/gin" "net/http")func Ping(c *gin.Context) { c.JSON(http.StatusOK, utils.ResultT("this is ping"))}func Login(c *gin.Context) { c.JSON(http.StatusOK, utils.ResultT(gin.H{ "token": handler.GenerateToken(&handler.UserClaims{ ID: "001", Name: "张三", Phone: "189***0023", StandardClaims: jwt.StandardClaims{}, }), }))}func UserInfo(c *gin.Context) { user, _ := c.Get("user") claims := user.(*handler.UserClaims) c.JSON(http.StatusOK, utils.ResultT(claims.Phone))}
"golang中gin框架接入jwt如何使用token验证身份"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
验证
用户
接入
信息
有效
方式
只是
接口
数据
时间
有效期
服务器
处理
服务
生成
框架
身份
内容
密码
就是
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全法正式实施的时间
周末学软件开发
会议直播软件开发
不可下载的视频服务器
制作服务器的用途
软件开发与技术就业
数据中心服务器核心技术股票
要创造网络安全工作条件
超融合服务器能装数据库吗
网络技术开发与应用专业
暗黑破坏神2连接服务器
对软件开发人员的理解
江苏艾蒂娜互联网科技公司
西安曹阳搞软件开发的
网络安全取证流程
以网络安全为主题绘画作品高中
域名根服务器管理器
频繁计算需要存到数据库吗
西安网络安全周图片
管理学网络技术
千锋网络安全学习
萌域宝可梦服务器如何上架物品
学软件开发好难
连接的服务器超时怎么回事
小学生网络安全发声亮剑
软件开发三个月选什么模式
app软件开发后怎么上传
河南省立善网络技术有限公司
空当接龙软件开发如何
网络安全上市公司最强的