import "github.com/dgrijalva/jwt-go"
var Secret string = "crypto"
注意如下 claims["iat"] 赋值不要用token.Claims["iat"]会报错(type jwt.Claims does not support indexing)
func (c Reg) Sign(uuid string, secret string) string {//生成token,算法hs256
token := jwt.New(jwt.SigningMethodHS256)
claims := make(jwt.MapClaims)
claims["iat"] = time.Now().Unix()
claims["id"] = uuid
claims["secret"] = secret //需私钥加密
token.Claims = claims
s, err := token.SignedString([]byte(secret))
if err != nil {
panic(err)
}
return s
}
func (c Reg) getValidationKey(*jwt.Token) (interface{}, error) {
return []byte(Secret), nil
}
//验证解析token
func (c Reg) VerifyToken(deviceuuid string, input string, secret string) (jwt.Claims, string) {
token, err := jwt.Parse(input, c.getValidationKey)
if err != nil {
return nil, err.Error()
}
if jwt.SigningMethodHS256.Alg() != token.Header["alg"] {
return nil, "header err!"
}
if claims,ok := token.Claims.(jwt.MapClaims); ok && token.Valid {//取出token中的数据
if claims["id"] != deviceuuid {
return nil, "token claims err"
}
}
fmt.Printf("verify pass!!!")
return token.Claims, ""
}
func main () {
token_new := c.Sign(deviceuuid, Secret)
VerifyToken(deviceuuid, token_new, Secret)
}