大项目的要求接口很多都需要使用Token去验证用户权限以及登录状态,所以在实现用户登录、注册相关接口时,就想着把jwt整合进项目中,jwt-go是一个采用go实现的jwt库,下面来学习一下基本使用。
JWT基础
jwt由三部分组成
- Header
- Payload
- Signature
这三部以
.连接,组成一个完整的JWT
Header
Header一般包含两个两个部分,token的类型(这里为JWT),使用的加密算法(RSA、SHA256等)
{ "alg": "HS256", "typ": "JWT" }
Payload
Payload中包含claims,其中附带信息,有三种类型:
- Registered claims:这是jwt已经预定义的一组claims,常用的过期时间(expiration time)属于这一部分。jwt制定了详细的验证规则
- Public claim:略
- Private claims:用户自行定义的claims属于这一类型,为了避免冲突不能与Registered claims重复。jwt不会主动验证
{ "sub": "1234567890", "name": "John Doe", "admin": true }
Signature
Signature用户自定的jwt签名,一个完整的使用HMAC SHA256加密的jwt如下所示
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload) + "." + secret)
jwt-go使用
安装
- 下载
go get -u github.com/golang-jwt/jwt/v5
- 引入
import "github.com/golang-jwt/jwt/v5"
构建jwt
假如我们想使用用户名作为claims以此去创建jwt,我们需要先定义一个结构体
type MyClaims struct {
Name string
jwt.RegisteredClaims // jwt预定义的claims
}
接着使用HS256加密算法创建jwt,并设置过期时间为1个小时。
claims := MyClaims {
"Jack"
jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(time.Now().Add(Time.Hour))
}
}
jwt := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
最后给jwt附加一个签名,这里需要注意的是不同加密算法,对签名的数据类型要求不一样,例如HS256需要[]byte类型的签名。
signature := "code!!!"
token, _ := token.SignedString([]byte(signature))
解析jwt
假如已经拥有一个jwt该如何进行解析呢
parseedToken, _ := jwt.ParseWithClaims(
token,
&MyClaims{},
func(token *jwt.Token) (interface{}, error) {
// 解析完成的回调函数,可以进行额外验证
return []byte("AllYourBase"), nil
}
)
if claims, ok := parseedToken.Claims.(*MyClaims); ok && token.Valid {
// 验证成功
} else {
// 验证失败
}