这是我参与「第五届青训营 」笔记创作活动的第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:载荷部分不能存放敏感信息,因为可以进行解码