共计 1438 个字符,预计需要花费 4 分钟才能阅读完成。
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
}
正文完