無概念,直接上代碼
生成谱邪、驗(yàn)證
package helpers
import (
"errors"
"fmt"
"github.com/dgrijalva/jwt-go"
"myapp/config"
"time"
)
//JWT = JSON WEB TOKEN 是一個開放標(biāo)準(zhǔn),用于作為json對象,在各個地方安全的傳輸信息
//此信息可以被驗(yàn)證和信任
type JWT struct {
SigningKey []byte //自定義密鑰
}
//自定義信息結(jié)構(gòu),根據(jù)需求填寫
type Claims struct {
Id uint //用戶id
NickName string //用戶名
AuthorityId string //用戶角色id
jwt.StandardClaims
}
//定義錯誤信息
var (
TokenExpired = errors.New("Token 已經(jīng)過期")
TokenNotValidYet = errors.New("Token 未激活")
TokenMalformed = errors.New("Token 錯誤")
TokenInvalid = errors.New("Token 無效")
)
//NewJWT 初始化
func NewJWT() *JWT {
//這里要注意馅而,SigningKey 這個值此疹,需要自定義
return &JWT{SigningKey: []byte(“testqhsjwt”)}
}
//CreateToken 創(chuàng)建 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 構(gòu)造中
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() {
//創(chuàng)建token
token := createToken()
//驗(yàn)證token
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", //簽名頒發(fā)者
},
}
token, err := j.CreateToken(c)
if err != nil {
fmt.Println("獲取token失敗:", err.Error())
return ""
}
fmt.Println( token)
return token
}
//checkToken 驗(yàn)證 解碼
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)
}