golang jwt-go 一个案例搞懂jwt鉴权
MyClaims,自定义Claims,保存一用户ID等信息
MySecret,服务器端加密解密使用,加密通过:token.SignedString(MySecret)
解密通过: jwt.ParseWithClaims(tokenss, &MyClaims{}, Secret()) , Secret是
jwt.Keyfunc。
ParseToken()后,得到自定义Claims.
package main
import (
"errors"
"fmt"
"time"
"github.com/golang-jwt/jwt/v4"
)
func main() {
tokenString, err := MakeToken("15888888888")
if err != nil {
fmt.Println(err)
}
fmt.Println("生成的token: ", tokenString)
mycaim, err := ParseToken(tokenString)
if err != nil {
fmt.Println(err)
}
// fmt.Printf("%#v", mycaim)
fmt.Println(mycaim.Phone)
}
type MyClaims struct {
Phone string `json:"phone"`
jwt.RegisteredClaims // 注意!这是jwt-go的v4版本新增的,原先是jwt.StandardClaims
}
var MySecret = []byte("手写的从前") // 定义secret,后面会用到
// 这里传入的是手机号,因为我项目登陆用的是手机号和密码
func MakeToken(phone string) (tokenString string, err error) {
claim := MyClaims{
Phone: phone,
RegisteredClaims: jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(time.Now().Add(3 * time.Hour * time.Duration(1))), // 过期时间3小时
IssuedAt: jwt.NewNumericDate(time.Now()), // 签发时间
NotBefore: jwt.NewNumericDate(time.Now()), // 生效时间
}}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claim) // 使用HS256算法
tokenString, err = token.SignedString(MySecret)
return tokenString, err
}
func Secret() jwt.Keyfunc {
return func(token *jwt.Token) (interface{}, error) {
return []byte("手写的从前"), nil // 这是我的secret
}
}
func ParseToken(tokenss string) (*MyClaims, error) {
token, err := jwt.ParseWithClaims(tokenss, &MyClaims{}, Secret())
if err != nil {
if ve, ok := err.(*jwt.ValidationError); ok {
if ve.Errors&jwt.ValidationErrorMalformed != 0 {
return nil, errors.New("that's not even a token")
} else if ve.Errors&jwt.ValidationErrorExpired != 0 {
return nil, errors.New("token is expired")
} else if ve.Errors&jwt.ValidationErrorNotValidYet != 0 {
return nil, errors.New("token not active yet")
} else {
return nil, errors.New("couldn't handle this token")
}
}
}
if claims, ok := token.Claims.(*MyClaims); ok && token.Valid {
return claims, nil
}
return nil, errors.New("couldn't handle this token")
}
还有一种使用jwt的request方式:
Utility package for extracting JWT tokens from HTTP requests.
token, err := request.ParseFromRequest(r, &extractor{}, keyFunc, request.WithClaims(&tk))
if err != nil || !token.Valid {
return http.StatusUnauthorized, nil
}