JWT 在 golang 中的使用
JWT (JSON Web Tokens)
JWT 可以说是一种无状态的身份认证机制;服务器不会维护身份验证的状态,作用与session,cookie 类似。
JWT 的结构
header(头部),payload(载荷),signature(签名) ,
并且三者是通过 “.” 拼接的。例如:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdXRob3JpemVkIjp0cnVlLCJleHAiOjE1NTQwMDA0NDQsImlzcyI6IiJ9.m2EwMPwo3Jg9mdJaDC_5LETYsofmsX6-mKqQXISZbRs
header
包含 alg ,typ 两个属性
- alg 表示签名的加密算法
- yp 表示token类型,此处用 JWT 类型。
例如
{
"alg": "HS256",
"typ": "JWT"
}
payload
payload 用来存放需要传递的信息。其中,除了JWT 规范定义的七个标准字段外,还可以包含自定义的数据。
官方给出的:
- iss : 发行者
- sub : 主题
- exp : 到期时间
- aud : 接收者
- nbf : 生效时间
- iat : 签发时间
- jti : jwt 的编号(每个令牌的唯一标识符)
signature
signature 是用于令牌验证的签名(可以说是对header,payload 再加上一个secret 的签名)。其由三部分组成 , 如下:
HMAC-SHA256 (
base64urlEncoding(header) + "."
base64urlEncoding(payload),
secret
)
JWT 在 golang 中的使用
package jwt 的相关文档
https://godoc.org/github.com/dgrijalva/jwt-go#example-New–Hmac
JWT 包的下载
go get github.com/dgrijalva/jwt-go
创建 Token
type jwtCustomClaims struct {
jwt.StandardClaims
}
func CreateToken( issuer string) (tokenString string, err error) {
SecretKey := []byte("123456") // 设置密钥
claims := &jwtCustomClaims{ // claims(即 payload) :存储需要传递的重要信息
jwt.StandardClaims{
ExpiresAt: int64(time.Now().Add(time.Second * 50).Unix()), // 设置过期时间为 50 秒
Issuer: issuer, // 设置令牌发行者,指明 Token 的用户
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) // 创建 Token 对象,第一个参数是签名的算法
tokenString, err = token.SignedString(SecretKey)
return
}
解析 Token
func ParseToken(tokenStr string) (iss string, err error) {
SecretKey := []byte("123456")
var token *jwt.Token
token, err = jwt.Parse(tokenStr, func(*jwt.Token) (interface{}, error) {
return SecretKey, nil
})
claims, _ := token.Claims.(jwt.MapClaims)
fmt.Println(claims)
if token.Valid { // 检查令牌是否有效
return claims["iss"].(string), nil
} else {
return claims["iss"].(string), errors.New("token无效")
}
}