关于golang:JWT生成与解析

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:生成jwt
func 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: 解析token
func 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
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理