参考资料
什么是jwt?
见https://www.yuque.com/u21069870/zwrbcf/rmf7r3#iB9bb
第三方库
go get github.com/dgrijalva/jwt-go
生成JWT
自定义jwt结构
// MyClaims 定义了jwt的数据结构
type MyClaims struct {
UserId int64 `json:"user_id"`
UserName string `json:"username"`
jwt.StandardClaims
}
�定义私钥
var mySecret = []byte("富贵猪爱吃鱼")
JWT生成
// GenToken 用于生成JWT
func GenToken(username string) (string, error) {
// 创建jwt声明(token的payload)
c := MyClaims{
// 自定义字段
UserId,
UserName,
// 标准jwt字段
jwt.StandardClaims{
ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(), // 过期时间
Issuer: "my-project", // 签发人
},
}
// 使用指定签名算法创建签名对象(token的signature)
token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)
// 使用自定义的secret签名并获得完整的token
return token.SignedString(MySecret)
}
解析JWT
// ParseToken 用于解析JWT
func ParseToken(tokenString string) (*MyClaims, error) {
// 解析token
token, err := jwt.ParseWithClaims(tokenString, &MyClaims{}, func(token *jwt.Token) (i interface{}, err error) {
return MySecret, nil
})
if err != nil {
return nil, err
}
if claims, ok := token.Claims.(*MyClaims); ok && token.Valid { // 校验token
return claims, nil
}
return nil, errors.New("invalid token")
}