jwt生成须要用到:github.com/dgrijalva/jwt-go包

  • 创立构造体
import (    "crypto/md5"    "encoding/hex"    "strconv"    "time"    "github.com/dgrijalva/jwt-go")type Claims struct {    Flag string    jwt.StandardClaims}
  • 生成token。生成token须要用到用户惟一标识,应用md5依据id生成惟一标识,不能应用用户名和明码去生成token,这会造成不平安。
// GenerateToken:生成jwtfunc GenerateToken(userID int64) (string, error) {    tokenConfig := config.Token    ex := tokenConfig.ExpiredTime    flag := GenerateUserFlag(userID)    expiredTime := time.Now().Add(time.Duration(ex) * time.Second)    claims := &Claims{        Flag: flag,        StandardClaims: jwt.StandardClaims{            ExpiresAt: expiredTime.Unix(), // 过期工夫            IssuedAt:  time.Now().Unix(),  // 颁发工夫            Id:        flag,               // 编号            Issuer:    tokenConfig.Issue,  // 颁发者            NotBefore: time.Now().Unix(),  // 失效工夫            Subject:   "user token",       // token主题        },    }    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)    tokenString, err := token.SignedString([]byte(tokenConfig.Salt))    if err != nil {        return "", err    }    return tokenString, nil}// GenerateUserFlag: 依据id应用md5生成用户惟一标识func GenerateUserFlag(userID int64) string {    md5 := md5.New()    md5.Write([]byte(strconv.FormatInt(userID, 10)))    return hex.EncodeToString(md5.Sum([]byte("")))}
须要留神的是:jwt..NewWithClaims的第一个参数必须是jwt.SigningMethodHS256,否则会报key is valid的谬误。
  • 解析Token
// ParseToken: 解析tokenfunc ParseToken(token string) (*Claims, error) {    tokenConfig := config.Token    tokenClaims, err := jwt.ParseWithClaims(token, &Claims{}, func(token *jwt.Token) (        interface{}, error) {        return []byte(tokenConfig.Salt), nil    })    if tokenClaims != nil {        if claims, ok := tokenClaims.Claims.(*Claims); ok && tokenClaims.Valid {            return claims, nil        }    }    return nil, err}