不讲概念,直接上代码
生成、验证
package helpers
import (
"errors"
"fmt"
"github.com/dgrijalva/jwt-go"
"myapp/config"
"time"
)
//JWT = JSON WEB TOKEN 是一个开放标准,用于作为json对象,在各个地方安全的传输信息
//此信息可以被验证和信任
type JWT struct {
SigningKey []byte //自定义密钥
}
//自定义信息结构,根据需求填写
type Claims struct {
Id uint //用户id
NickName string //用户名
AuthorityId string //用户角色id
jwt.StandardClaims
}
//定义错误信息
var (
TokenExpired = errors.New("Token 已经过期")
TokenNotValidYet = errors.New("Token 未激活")
TokenMalformed = errors.New("Token 错误")
TokenInvalid = errors.New("Token 无效")
)
//NewJWT 初始化
func NewJWT() *JWT {
//这里要注意,SigningKey 这个值,需要自定义
return &JWT{SigningKey: []byte(“testqhsjwt”)}
}
//CreateToken 创建 token
func (j *JWT) CreateToken(c Claims) (string, error) {
token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)
return token.SignedString(j.SigningKey)
}
//ParseToken 解析 token
func (j *JWT) ParseToken(tokenString string) (*Claims, error) {
token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) {
return j.SigningKey, nil
})
if err != nil {
if ve, ok := err.(*jwt.ValidationError); ok {
if ve.Errors&jwt.ValidationErrorMalformed != 0 {
return nil, TokenMalformed
} else if ve.Errors&jwt.ValidationErrorExpired != 0 {
return nil, TokenExpired
} else if ve.Errors&jwt.ValidationErrorNotValidYet != 0 {
return nil, TokenNotValidYet
} else {
return nil, TokenInvalid
}
}
}
if token == nil {
return nil, TokenInvalid
}
//解析到Claims 构造中
if c, ok := token.Claims.(*Claims); ok && token.Valid {
return c, nil
}
return nil, TokenInvalid
}
//RefreshToken 更新 token
func (j *JWT) RefreshToken(tokenString string) (string, error) {
jwt.TimeFunc = func() time.Time {
return time.Unix(0, 0)
}
token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) {
return j.SigningKey, nil
})
if err != nil {
return "", err
}
if c, ok := token.Claims.(*Claims); ok && token.Valid {
jwt.TimeFunc = time.Now
c.StandardClaims.ExpiresAt = time.Now().Add(1 * time.Hour).Unix()
return j.CreateToken(*c)
}
return "", TokenInvalid
}
使用
func main() {
token := createToken()
checkToken(token)
}
//createToken 生成
func createToken() string {
j := helpers.NewJWT()
c := helpers.Claims{
Id: 10001,
NickName: "test",
AuthorityId: "1",
StandardClaims: jwt.StandardClaims{
NotBefore: time.Now().Unix() - 1000, //签名生效时间
ExpiresAt: time.Now().Unix() + 60*60*24*7, //签名过期时间
Issuer: "qhs", //签名颁发者
},
}
token, err := j.CreateToken(c)
if err != nil {
fmt.Println("获取token失败:", err.Error())
return ""
}
fmt.Println( token)
return token
}
//checkToken 验证 解码
func checkToken(token string) {
j := helpers.NewJWT()
c, err := j.ParseToken(token)
if err != nil {
fmt.Println("解析token失败:", err.Error())
return
}
fmt.Printf("id:%v,name:%s,auth:%s , btime : %v ,eTime:%v", c.Id, c.NickName, c.AuthorityId,c.NotBefore,c.ExpiresAt)
}
有疑问加站长微信联系(非本文作者)