JWT生成与解析
【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
}
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- Docker应用:容器间通信与Mariadb数据库主从复制
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 第326天
- Shell-Bash变量与运算符
- 逻辑回归的理解与python示例
- Guava|Guava RateLimiter与限流算法
- 我和你之前距离
- CGI,FastCGI,PHP-CGI与PHP-FPM
- 原生家庭之痛与超越