文章目录

  • 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和登录认证相关推荐

  1. Go 语言 Gin 框架实战项目笔记

    Go 语言 Gin 框架实战 后端 Goland 操作 创建项目 运行项目 数据库操作 jwt.Response 配置管理 获取请求参数 数据验证 使用 UUID 前端 环境搭建 创建项目 ESLin ...

  2. go语言 gin框架中集成zap日志库

    在go语言gin框架中,日志是默认输出到终端的,但是我们在实际工作中,一般来说是需要记录服务器日志的.而最常用的日志库就是zap日志库,我们需要将gin在终端输出的内容通过zap日志库记录到文件中,首 ...

  3. 厉害,我带的实习生仅用四步就整合好SpringSecurity+JWT实现登录认证

    小二是新来的实习生,作为技术 leader,我还是很负责任的,有什么锅都想甩给他,啊,不,一不小心怎么把心里话全说出来了呢?重来! 小二是新来的实习生,作为技术 leader,我还是很负责任的,有什么 ...

  4. 冰岩作坊Task1-----go语言+gin框架+前后端“交流”

    果然我还是应该写点东西记录些什么 前言 据mentor说Google是更优秀的学术平台( 以下内容为mentor所授,鸣谢 go语言 go语言,一个感觉起来包含了很多语言元素的语言,什么c的print ...

  5. go语言gin框架学习

    让框架去做http解包封包等,让我们的精力用在应用层开发 MVC模式 M: model,操作数据库gorm view 视图 处理模板页面 contoller 控制器 路由 +逻辑函数 解决gin相关代 ...

  6. Go语言Gin框架源码分析

    gin框架路由详解 gin框架使用的是定制版本的httprouter,其路由的原理是大量使用公共前缀的树结构,它基本上是一个紧凑的Trie tree(或者只是Radix Tree).具有公共前缀的节点 ...

  7. JWT 实现登录认证 + Token 自动续期方案

    前言 过去这段时间主要负责了项目中的用户管理模块,用户管理模块会涉及到加密及认证流程.今天就来讲讲认证功能的技术选型及实现.技术上没啥难度当然也没啥挑战,但是对一个原先没写过认证功能的菜鸡来说也是一种 ...

  8. gin context和官方context_Go语言gin框架从入门到精通(3)

    gin的渲染 1 各种数据格式的响应 json.结构体.XML.YAML类似于java的properties.ProtoBuf 分别对所有数据格式举个列子 func main() {r := gin. ...

  9. 【Gin⭐012】Go语言Gin框架-错误信息翻译成中文

    1:翻译的通用函数 2:初始化通用函数 3:转换错误信息格式 4:翻译错误信息 package mainimport ("fmt""net/http"" ...

最新文章

  1. android Theme启动APP闪屏处理
  2. pycharm2017设置注释字体颜色
  3. linux程序员的proc文件系统
  4. Distributed Systems笔记-Web Service Design Patterns
  5. Failed to execute
  6. iview select选中值取值_iView的Select选择框
  7. Oracle常用数据库操作SQL
  8. php session 自定义的设置测试
  9. TDA2030功放电路图
  10. c语言数字转成大写,c语言 数字变大写 代码
  11. LabVIEW终止符
  12. Qcon演讲纪实:详解如何在实时视频通话中实现AR功能
  13. 基于Mono.Cecil的静态注入
  14. HTML学生作业网页:使用HTML+CSS技术实现传统文化网页设计题材-西安事变历史纪念馆 10页 带视频 带音乐
  15. 如何给CSDN博客添加微信公众号二维码或自定义栏目
  16. 高德地图加载谷歌地图瓦片
  17. Gym - 101350I - Mirrored String II (马拉车)
  18. android自定义相机拍照
  19. 推荐几款图形转代码的工具
  20. MySQL_MySQL配置文件

热门文章

  1. 一年经验工作了三年,拥有三年工作经验,你是哪一种?
  2. python简单名片管理器,一个简单的Python名片管理系统
  3. excel计算机不准确,Excel排序不准确的解决方法
  4. 班主任工作中如何融入生态文明教育?
  5. 多易教育KAFKA实战(2)-java生产者客户端API示例代码
  6. 12.嵌入式控制器EC实战 SMBus概述
  7. 科研成果 | 信道模型 | 原理及随机数仿真 | 均匀、正态、双高斯、瑞利、莱斯、对数正态、nakagami、Suzuki分布的随机数仿真(matlab)
  8. 应急照明市电检测_应急照明接线方式,这几点你必须知道!
  9. PyTorch单机多卡训练(DDP-DistributedDataParallel的使用)备忘记录
  10. linux usb信息查看工具,Linux下,查看USB设备信息