本文共 2331 字,大约阅读时间需要 7 分钟。
JWT是一种协议,和语言无关,只需要按照协议来加密和解析即可,但是golang是强类型的,所以自定义的claims中的各字段要正确定义,否则无法解析。
首先需要设置加密算法(比如 HS256)和 JWT Secret。
当拿到一个JWT Token之后可以先查看其三个部分的定义。
关于JWT的原理可以参考也就是说,通过JWT Token 就可以知道算法(第一部分)和claims(第二部分)。
生成token和解析token
/*-- @Time : 2020/9/27 16:34-- @Author : raoxiaoya-- @Desc : jwt parser for laravel jwt*/package jwtimport ( "fmt" "github.com/dgrijalva/jwt-go" "time" "voteapi/pkg/setting" "voteapi/pkg/util")type CustomClaims struct { Iss string `json:"iss,omitempty"` Iat int64 `json:"iat,omitempty"` Exp int64 `json:"exp,omitempty"` Nbf int64 `json:"nbf,omitempty"` Jti string `json:"jti,omitempty"` Sub int64 `json:"sub,omitempty"` Prv string `json:"prv,omitempty"`}func (c CustomClaims) Valid() error { // 过期时间 if time.Now().Unix() > c.Exp { return fmt.Errorf("the token is expired") } // 颁发者 //if c.Iss != setting.JwtConfig.JWTIss { // return fmt.Errorf("the token is invalid") //} // 私钥 //if c.Prv != setting.JwtConfig.JWTPrv { // return fmt.Errorf("the token is invalid") //} return nil}func CreateToken(userId int64, phone string) string { curr := time.Now().Unix() customClaims := &CustomClaims{ Iss: setting.JwtConfig.JWTIss, Iat: curr, Exp: curr + setting.JwtConfig.JWTExpire, Nbf: curr + setting.JwtConfig.JWTExpire, Jti: util.RandString(20), Sub: userId, Prv: setting.JwtConfig.JWTPrv, } // 采用HMAC SHA256加密算法 token := jwt.NewWithClaims(jwt.SigningMethodHS256, customClaims) tokenString, err := token.SignedString([]byte(setting.JwtConfig.JWTSecret)) if err != nil { panic(err) } return tokenString}func ParseToken(tokenString string) (*CustomClaims, error) { token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{ }, func(token *jwt.Token) (interface{ }, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("Unexpected signing method: %s", token.Header["alg"]) } return []byte(setting.JwtConfig.JWTSecret), nil }) if err != nil || token == nil { return nil, err } if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid { return claims, nil } else { return nil, err }}
配置项
[jwt]JWTExpire = 3600JWTSecret = 4N1BhLGdpFK5F2AH1txDOrlEFSs5adetJWTIss = http://172.31.205.102/uc/ucenter/answerLoginByCodeJWTPrv = f6b71549db8c2c42b75827aa44f02b7ee529d24d
在Valid方法中添加额外的校验规则。
Sub 字段存储了最终的信息。转载地址:http://dcaui.baihongyu.com/