这是我参与「第五届青训营 」伴学笔记创作活动的第 六 天
介绍
JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种方式,用于在各方之间安全地将信息作为 JSON 对象传输。由于此信息是经过数字签名的,因此可以被验证和信任。可以使用秘密(使用 HMAC 算法)或使用 RSA 或 ECDSA 的公钥/私钥对对 JWT 进行签名。
安装jwt-go
go get -u github.com/dgrijalva/jwt-go@v3.2.0
生成 token
使用 jwt-go 库生成 token,我们需要定义需求(claims),也就是说我们需要通过 jwt 传输的数据。假如我们需要传输 ID 和 Username,我们可以定义 Claims 结构体,其中包含 ID 和 Username 字段,还有在 jwt-go 包预定义的 jwt.StandardClaims。
type Claims struct {
- ID int64
Username string
jwt.StandardClaims
}
jwt.StandardClaims 包含的字段:
type StandardClaims struct { Audience string `json:"aud,omitempty"` ExpiresAt int64 `json:"exp,omitempty"` Id string `json:"jti,omitempty"` IssuedAt int64 `json:"iat,omitempty"` Issuer string `json:"iss,omitempty"` NotBefore int64 `json:"nbf,omitempty"` Subject string `json:"sub,omitempty"` }
其中 ExpiresAt 和 Issuer 分别是过期时间和签发者。
使用 jwt-go 库根据指定的算法生成 jwt token ,主要用到两个方法:
jwt.NewWithClaims 方法:
func (*jwt.Token).SignedString(key interface{}) (string, error)
SignedString 方法根据传入的空接口类型参数 key,返回完整的签名令牌
解析Token
使用 jwt-go 库解析 token,主要用到两个方法,分别用通过与解析传入的 token 字符串,和根据 MyCustomClaims 结构体定义的相关属性要求进行校验。
- jwt.ParseWithClaims 方法:
func jwt.ParseWithClaims(tokenString string, claims jwt.Claims, keyFunc jwt.Keyfunc) (*jwt.Token, error)
wt.ParseWithClaims 方法用于解析鉴权的声明,返回 *jwt.Token。
Valid 方法用于校验鉴权的声明。
总结
本文开头介绍了什么是 JWT,和怎么安装 jwt-go 库。然后通过生成 token 和解析 token 两个示例,介绍了其中需要用到的四个方法。jwt-go 库还有很多其他方法,限于篇幅,没有一一介绍。感兴趣的读者,可以阅读 jwt-go 库的文档进一步了解。