高能预警正文

关于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 或其他资源的过程
来自:jwt.io
感谢阅读。