东林博客

Go 使用JWT生成Token和解析Token还原参数

什么是JWT?

JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于网络应用环境间传递声明而执行的一种基于JSON的开放标准。JWT传递的信息可以被验证和信任,因为它是数字签名的。JWTs可以使用一个秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对来签名。

JSON Web Token的组成

JSON Web令牌由由点(.)分隔的三个部分组成:

  • Header

  • Payload

  • Signature

因此,JWT通常看起来是这样的。
xxxxx.yyyyy.zzzzz

Golang 中使用Token鉴权

使用Golang开发APP API的时候,需要针对已登录用户发放凭证Token,把user_id加密到token中。APP 请求参数的同时,通过header把token传回。再解析token,拿到其中加密的user_id。安全、高效、无依赖。

首先引用包:

go get github.com/dgrijalva/jwt-go

我在goframe中写了一个针对JWT加密解密的服务,其中部分用到了goframe的包:

package jmtoken

import (
   "errors"
   "github.com/dgrijalva/jwt-go"
   "github.com/gogf/gf/frame/g"
   "github.com/gogf/gf/util/gconv"
   "time"
)
/**
传入参数,进行加密
 */

func Encode(params map[string]string) (string) {
   token := jwt.New(jwt.SigningMethodHS256)
   claims := make(jwt.MapClaims)
   claims["exp"] = time.Now().Add(time.Hour * time.Duration(1)).Unix()
   claims["iat"] = time.Now().Unix()
   for key, value := range params {
      claims[key] = value
   }
   token.Claims = claims
   secret := g.Config().GetString("setting.secret")
   tokenString, _ := token.SignedString([]byte(secret))
   return tokenString
}
/**
传入token,解密
 */
func Decode(token string) (g.Map, error) {
   var params = g.Map{}
   var secret = g.Config().GetString("setting.secret")
   parseAuth, err := jwt.Parse(token, func(*jwt.Token) (interface{}, error) {
      return []byte(secret), nil
   })
   if err != nil {
      return params, errors.New("TOKEN ERROR!")
   }
   //将token中的内容存入parmMap
   claim := parseAuth.Claims.(jwt.MapClaims)
   var parmMap map[string]interface{}
   parmMap = make(map[string]interface{})
   for key, val := range claim {
      parmMap[key] = val
   }
   return gconv.Map(parmMap), nil
}


{{tip}}