GO语言gin框架实战-02-Jwt和登录认证
文章目录
- 1. 相关函数
- 2. router对其调用
- 3. 其他接口身份验证
- 4. postman 测试
- 4.1 测试登录接口
- 4.2 postman设置Cookies
- 4.3 其他接口调用身份验证测试
1. 相关函数
创建如下函数:
- 登录函数:登录接口调用该函数
- 身份验证:其他函数调用该函数,用token判断身份是否合法
- 刷新token:登录接口调用该函数,如果token验证通过则发放新token
- 验证token:需要验证身份的服务调用该函数判断token是否合法
- 生成token: 其他函数调用该函数,用以生成新token
package routerimport ("github.com/dgrijalva/jwt-go""github.com/gin-gonic/gin""time"
)type LoginInfo struct {UserName string `json:"user_name"`Password string `json:"password"`
}type JWTClaims struct { // token里面添加用户信息,验证token后可能会用到用户信息jwt.StandardClaimsUserID int `json:"user_id"`Password string `json:"password"`Username string `json:"username"`FullName string `json:"full_name"`Permissions []string `json:"permissions"`
}var (Secret = "LiuBei" // 加盐ExpireTime = 3600*24 // token有效期
)//登录
func Login(c *gin.Context) {var loginRequest LoginInfoerr := c.Bind(&loginRequest)if err != nil {c.JSON(400,err.Error())return}//模拟用户认证if loginRequest.UserName != "liuBei" || loginRequest.Password != "liubei@161" {c.JSON(401,gin.H{"err":"账号或密码错误"})return}claims := &JWTClaims{UserID: 1,Username: loginRequest.UserName,Password: loginRequest.Password,FullName: loginRequest.UserName,Permissions: []string{},}claims.IssuedAt = time.Now().Unix()claims.ExpiresAt = time.Now().Add(time.Second * time.Duration(ExpireTime)).Unix()signedToken,err:=getToken(claims)if err!=nil {c.JSON(400,err.Error())return}//fmt.Printf(signedToken)c.JSON(200, gin.H{"token": signedToken})
}//身份验证func Verify(c *gin.Context)(result bool,userName string,err error) {strToken,err := c.Cookie("Crow")if strToken == ""{result = falsereturn result,"",nil}claim,err := verifyAction(strToken)if err != nil {result = falsereturn result,"",nil}result = trueuserName = claim.Usernamereturn result,userName,nil
}//刷新token
func Refresh(c *gin.Context) {strToken,err := c.Cookie("Crow")claims,err := verifyAction(strToken)if err != nil {c.JSON(400,gin.H{"err":err.Error()})return}claims.ExpiresAt = time.Now().Unix() + (claims.ExpiresAt - claims.IssuedAt)signedToken,err:=getToken(claims)if err!=nil{c.JSON(400,gin.H{"err":err.Error()})return}c.JSON(200,gin.H{"data": signedToken })
}//验证token是否存在,存在则获取信息
func verifyAction(strToken string) (claims *JWTClaims,err error) {token, err := jwt.ParseWithClaims(strToken, &JWTClaims{}, func(token *jwt.Token) (interface{}, error) {return []byte(Secret), nil})if err != nil {return nil, err}claims, ok := token.Claims.(*JWTClaims)if !ok {return nil, err}if err := token.Claims.Valid(); err != nil {return nil, err}return claims, nil
}//生成token
func getToken(claims *JWTClaims)(signedToken string,err error){token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)signedToken, err = token.SignedString([]byte(Secret))if err != nil {return "",err}return signedToken,nil
}
2. router对其调用
loginGroup := r.Group("/api/v1/login"){loginGroup.POST("/", Login) //登录服务器loginGroup.POST("/refresh", Refresh) //生成新token}
3. 其他接口身份验证
以上一章k8s服务的 查询deployment接口为例,开头添加如下内容:
func GetDeployment(c *gin.Context) {//身份认证checkUser,_,err := Verify(c) //第二个值是用户名,这里没有使用if err != nil{c.JSON(400,gin.H{"err":err.Error()})return}if checkUser == false {c.JSON(400,gin.H{"err":"身份认证失败"})return}//查询开始……
}
4. postman 测试
4.1 测试登录接口
登录成功获取到token。
4.2 postman设置Cookies
注意:
Crow
这个 key的名字是刚才我们在代码里边指定的
4.3 其他接口调用身份验证测试
- 成功的情况
我们可以看到Headers里多了我们刚才添加的Cookie,是我们刚才添加的Crow
- 验证失败的情况
我们把刚才的Cookie改成错的,然后再测试:
GO语言gin框架实战-02-Jwt和登录认证相关推荐
- Go 语言 Gin 框架实战项目笔记
Go 语言 Gin 框架实战 后端 Goland 操作 创建项目 运行项目 数据库操作 jwt.Response 配置管理 获取请求参数 数据验证 使用 UUID 前端 环境搭建 创建项目 ESLin ...
- go语言 gin框架中集成zap日志库
在go语言gin框架中,日志是默认输出到终端的,但是我们在实际工作中,一般来说是需要记录服务器日志的.而最常用的日志库就是zap日志库,我们需要将gin在终端输出的内容通过zap日志库记录到文件中,首 ...
- 厉害,我带的实习生仅用四步就整合好SpringSecurity+JWT实现登录认证
小二是新来的实习生,作为技术 leader,我还是很负责任的,有什么锅都想甩给他,啊,不,一不小心怎么把心里话全说出来了呢?重来! 小二是新来的实习生,作为技术 leader,我还是很负责任的,有什么 ...
- 冰岩作坊Task1-----go语言+gin框架+前后端“交流”
果然我还是应该写点东西记录些什么 前言 据mentor说Google是更优秀的学术平台( 以下内容为mentor所授,鸣谢 go语言 go语言,一个感觉起来包含了很多语言元素的语言,什么c的print ...
- go语言gin框架学习
让框架去做http解包封包等,让我们的精力用在应用层开发 MVC模式 M: model,操作数据库gorm view 视图 处理模板页面 contoller 控制器 路由 +逻辑函数 解决gin相关代 ...
- Go语言Gin框架源码分析
gin框架路由详解 gin框架使用的是定制版本的httprouter,其路由的原理是大量使用公共前缀的树结构,它基本上是一个紧凑的Trie tree(或者只是Radix Tree).具有公共前缀的节点 ...
- JWT 实现登录认证 + Token 自动续期方案
前言 过去这段时间主要负责了项目中的用户管理模块,用户管理模块会涉及到加密及认证流程.今天就来讲讲认证功能的技术选型及实现.技术上没啥难度当然也没啥挑战,但是对一个原先没写过认证功能的菜鸡来说也是一种 ...
- gin context和官方context_Go语言gin框架从入门到精通(3)
gin的渲染 1 各种数据格式的响应 json.结构体.XML.YAML类似于java的properties.ProtoBuf 分别对所有数据格式举个列子 func main() {r := gin. ...
- 【Gin⭐012】Go语言Gin框架-错误信息翻译成中文
1:翻译的通用函数 2:初始化通用函数 3:转换错误信息格式 4:翻译错误信息 package mainimport ("fmt""net/http"" ...
最新文章
- android Theme启动APP闪屏处理
- pycharm2017设置注释字体颜色
- linux程序员的proc文件系统
- Distributed Systems笔记-Web Service Design Patterns
- Failed to execute
- iview select选中值取值_iView的Select选择框
- Oracle常用数据库操作SQL
- php session 自定义的设置测试
- TDA2030功放电路图
- c语言数字转成大写,c语言 数字变大写 代码
- LabVIEW终止符
- Qcon演讲纪实:详解如何在实时视频通话中实现AR功能
- 基于Mono.Cecil的静态注入
- HTML学生作业网页:使用HTML+CSS技术实现传统文化网页设计题材-西安事变历史纪念馆 10页 带视频 带音乐
- 如何给CSDN博客添加微信公众号二维码或自定义栏目
- 高德地图加载谷歌地图瓦片
- Gym - 101350I - Mirrored String II (马拉车)
- android自定义相机拍照
- 推荐几款图形转代码的工具
- MySQL_MySQL配置文件
热门文章
- 一年经验工作了三年,拥有三年工作经验,你是哪一种?
- python简单名片管理器,一个简单的Python名片管理系统
- excel计算机不准确,Excel排序不准确的解决方法
- 班主任工作中如何融入生态文明教育?
- 多易教育KAFKA实战(2)-java生产者客户端API示例代码
- 12.嵌入式控制器EC实战 SMBus概述
- 科研成果 | 信道模型 | 原理及随机数仿真 | 均匀、正态、双高斯、瑞利、莱斯、对数正态、nakagami、Suzuki分布的随机数仿真(matlab)
- 应急照明市电检测_应急照明接线方式,这几点你必须知道!
- PyTorch单机多卡训练(DDP-DistributedDataParallel的使用)备忘记录
- linux usb信息查看工具,Linux下,查看USB设备信息