参考资料
什么是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 用于生成JWTfunc 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签名并获得完整的tokenreturn token.SignedString(MySecret)}
解析JWT
// ParseToken 用于解析JWTfunc ParseToken(tokenString string) (*MyClaims, error) {// 解析tokentoken, 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 { // 校验tokenreturn claims, nil}return nil, errors.New("invalid token")}
