关于JWT
JWT
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdXRob3JpemVkIjp0cnVlLCJleHAiOjE2NDE5ODk4NDgsInVzZXJuYW1lIjoiYSJ9.zW11Cq8QNHTHJMUResrQeKVRTNLUlDymVsTPy2ororI
那我们如何从这串乱码中 得到我们想要的数据呢?
分解JWT
我们通过观察这串乱码发现,其被“.”分割成了三部分,下面博主将分别解释这三段内容,请君继续阅读
JWT第一部分:Header
base64
func main() {
decodeString, _ := base64.StdEncoding.DecodeString(
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9")
fmt.Println(string(decodeString))
}
得到了这样的结果:
{"alg":"HS256","typ":"JWT"}
HeadertypHS256JSON对象base64
JWT第二部分:Payload
base64
{"authorized":true,"exp":1641990483,"username":"a"}
实际上,这个JSON对象是我们自己定义的,代码如下:
func CreateJWT(username string, key string) (string, error) {
c := jwt.MapClaims{}
c["authorized"] = true
c["username"] = username
c["exp"] = time.Now().Add(600 * time.Second).Unix()
t := jwt.NewWithClaims(jwt.SigningMethodHS256, c)
token, err := t.SignedString([]byte(key))
if err != nil {
return "", err
}
return token, err
}
Payloadbase64jwt.MapClaims{}map[string]interface{}
// Claims type that uses the map[string]interface{} for JSON decoding
// This is the default claims type if you don't supply one
type MapClaims map[string]interface{}
Signature
JWT第三部分:Signature
header.payloadtypHTMLHTTPXMLSAML
小结
不论是我们自定义的密钥,还是JWT的签发过程,都是在服务端完成的,也就是说在我们保护好密钥的前提下,JWT是可以完成权限鉴定的。
附图
将JWT用于访问 API 或其他资源的过程
感谢阅读。