在线验证:jwt.io/
用法
MapClaims
MapClaims是一个map[string]interface{},用来保存一些数据,和Payload对应。
值的整形变量最终类型都为float64,取值是需要先进行类型转换
生成Token
jwt.NewWithClaims(SigningMethod,MapClaims)
SigningMethod:签名算法。库中内置了常用的算法。最常用的是HS256,对应的是jwt.SigningMehtodHS256。
MapClaims:需要传递的信息。
Token.SignedString([]byte):将密钥转换为[]byte传入方法中,生成签名。
func Sign(info AuthInfo, secret string) (tokenString string, err error) {
//传入指定的签名方法和payload信息,创建Token对象
//库中内置了好几种签名方法
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"id": info.ID,
"username": info.Username,
"nbf": time.Now().Unix(),
"iat": time.Now().Unix(),
})
//根据密码生成token字符串
tokenString, err = token.SignedString([]byte(secret))
return tokenString, err
}
解析Token
注意:回调函数中返回的也是密钥转换的[]byte.
func Parse(secret, tokenString string) (*AuthInfo, error) {
//解析传入的token
//第二个参数是一个回调函数,作用是判断生成token所用的签名算法是否和传入token的签名算法是否一致。
//算法匹配就返回密钥,用来解析token.
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (i interface{}, err error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
}
return []byte(secret), nil
})
//err不为空,说明token已过期
if err != nil {
return nil, err
}
//将获取的token中的Claims强转为MapClaims
claims, ok := token.Claims.(jwt.MapClaims)
//判断token是否有效
if !(ok && token.Valid) {
return nil, errors.New("cannot convert claim to mapClaim")
}
//获取payload中的数据
info := &AuthInfo{
ID: uint64(claims["id"].(float64)),
Username: claims["username"].(string),
}
return info, nil
}