JWT(JSON Web Token)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为 JSON 对象。这种信息可以被验证和信任,因为它是数字签名的。

以下是 JWT 的一些主要特性:

  1. 紧凑(Compact):由于其小的尺寸,JWT 可以通过 URL、POST 参数或者在 HTTP header 中发送,这使得 JWT 非常适合用于通过 HTTP/HTTPS 协议传输。
  2. 自包含(Self-contained):JWT 的载荷中包含了所有用户需要的信息,避免了多次查询数据库。
  3. 简单(Simple):客户端可以自行处理 JWT,服务器只需要在接收到 JWT 后进行解码验证即可,不需要保存会话信息。

JWT 的结构包括三部分:Header(头部)、Payload(载荷)和 Signature(签名)。

  • Header:头部通常包含两部分:token 类型和采用的加密算法。
  • Payload:载荷就是存放有效信息的地方。这些信息包含三个部分:标准中注册的声明、公共的声明和私有的声明。
  • Signature:签名是对头部和载荷信息进行签名,以防止数据被篡改。

注意:JWT 的载荷(Payload)信息是 Base64 编码的,所以不应该在 JWT 中放置敏感信息,例如密码等。

以下是使用 github.com/golang-jwt/jwt 库创建和解码 JWT 的 Go 语言示例:

首先,你需要安装 golang-jwt/jwt 库,可以通过以下命令进行安装:

go get github.com/golang-jwt/jwt/v5

然后,你可以使用以下代码创建和解码 JWT:

package main

import (
	"fmt"
	"time"

	"github.com/golang-jwt/jwt/v5"
)

var mySigningKey = []byte("secret")

func main() {
	// Create a new token object, specifying signing method and the claims
	// you would like it to contain.
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.RegisteredClaims{
		ExpiresAt: jwtv5.NewNumericDate(now.Add(time.Hour)),
		Issuer:    "issuer",
		Subject:   fmt.Sprintf("%d", user.ID),
	})

	// Sign and get the complete encoded token as a string using the secret
	tokenString, err := token.SignedString(mySigningKey)

	fmt.Println("JWT:", tokenString, err)

	// Now parse the token
	parsedToken, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
		return mySigningKey, nil
	})

	if claims, ok := parsedToken.Claims.(jwt.MapClaims); ok && parsedToken.Valid {
		fmt.Println(claims["iss"], claims["sub"], claims["exp"])
	} else {
		fmt.Println(err)
	}
}

在这个示例中,我们首先创建了一个新的 JWT,并指定了签名方法和声明;然后,使用一个密钥签名并获取完整编码的 token;最后,我们解析 token,并验证签名方法和声明。


孟斯特

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意