Golang中token的使用|青训营笔记

409 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第10天

Golang中token的使用

  • 什么是token

Token在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思。一般作为邀请、登录系统使用。

在这次青训营的后端大作业项目中就需要用到token

具体步骤

  • 导入JWT包
go get -u github.com/labstack/echo/v4
  • 创建一个结构体,里面包含我们需要写入token中的属性
  • 在结构体的属性中添加一个属性: jwt.RegisteredClaims

type Claims struct { ID string UserName string jwt.StandardClaims // jwt中标准格式,主要是设置token的过期时间 }

  • 定义密钥

注意,这个密钥是绝对不可以泄露的,否则token里面的数据会失去安全性

// 签名 var sign = "string"

  • 生成token

定义一个生成token的函数

// GenerateToken() 生成token // 调用库的NewWithClaims(加密方式,载荷).SignedString(签名) 生成token func GetnerateToken()(string,error) { // 当前时间 nowTime := time.Now() // 过期时间 expireTime := nowTime.Add(300 * time.Second) // 签发人 issuer := "xxx" // 赋值给结构体 claims := Claims{ ID :"345666", UserName:"xxx", StandardClaims:jwt.StandardClaims{ ExpiresAt: expireTime.Unix(), // 转成纳秒 Issuer: issuer, }, } // 根据签名生成token,NewWithClaims(加密方式,claims) ==》 头部,载荷,签证 toke,err := jwt.NewWithClaims(jwt.SigningMethodHS256,claims).SignedString([]byte(sign)) return toke,err }

  • 将token解析为我们想要的数据

// ParseToken 解析token // 调用ParseWithClaims进行解析,使用签名解密出数据 func ParseToken(token string) (*Claims,error){ // ParseWithClaims 解析token tokenClaims,err := jwt.ParseWithClaims(token,&Claims{}, func(token *jwt.Token)(interface{},error) { // 使用签名解析用户传入的token,获取载荷部分数据 return []byte(sign),nil }) if err != nil { return nil,err } if tokenClaims != nil { //Valid用于校验鉴权声明。解析出载荷部分 if c,ok := tokenClaims.Claims.(*Claims);ok && tokenClaims.Valid{ return c,nil } } return nil,err }

  • token的优点和缺点

    优点: 1:字节占用小,传输很简单 2:不需要存储在服务端,很容易拓展 缺点: 1:由于存储在客户端,对于过期时间,服务端无法把控。出现问题,不安全 2:载荷部分不能存放敏感信息,因为可以进行解码