Golang中JWT的使用

3,481 阅读1分钟

地址:github.com/dgrijalva/j…

在线验证:jwt.io/

用法

MapClaims

MapClaims是一个map[string]interface{},用来保存一些数据,和Payload对应。

值的整形变量最终类型都为float64,取值是需要先进行类型转换

生成Token

jwt.NewWithClaims(SigningMethod,MapClaims)

SigningMethod:签名算法。库中内置了常用的算法。最常用的是HS256,对应的是jwt.SigningMehtodHS256

MapClaims:需要传递的信息。

Token.SignedString([]byte):将密钥转换为[]byte传入方法中,生成签名。

func Sign(info AuthInfo, secret string) (tokenString string, err error) {
   //传入指定的签名方法和payload信息,创建Token对象
   //库中内置了好几种签名方法
   token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
      "id":       info.ID,
      "username": info.Username,
      "nbf":      time.Now().Unix(),
      "iat":      time.Now().Unix(),
   })
   //根据密码生成token字符串
   tokenString, err = token.SignedString([]byte(secret))
   return tokenString, err
}

解析Token

注意:回调函数中返回的也是密钥转换的[]byte.

func Parse(secret, tokenString string) (*AuthInfo, error) {
   //解析传入的token
   //第二个参数是一个回调函数,作用是判断生成token所用的签名算法是否和传入token的签名算法是否一致。
   //算法匹配就返回密钥,用来解析token.
   token, err := jwt.Parse(tokenString, func(token *jwt.Token) (i interface{}, err error) {
      if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
         return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
      }
      return []byte(secret), nil
   })

//err不为空,说明token已过期
   if err != nil {
      return nil, err
   }

   //将获取的token中的Claims强转为MapClaims
   claims, ok := token.Claims.(jwt.MapClaims)
   //判断token是否有效
   if !(ok && token.Valid) {
      return nil, errors.New("cannot convert claim to mapClaim")
   }
   //获取payload中的数据
   info := &AuthInfo{
      ID:       uint64(claims["id"].(float64)),
      Username: claims["username"].(string),
   }
   return info, nil
}