JWT(JSON Web Token)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为 JSON 对象。这种信息可以被验证和信任,因为它是数字签名的。
以下是 JWT 的一些主要特性:
- 紧凑(Compact):由于其小的尺寸,JWT 可以通过 URL、POST 参数或者在 HTTP header 中发送,这使得 JWT 非常适合用于通过 HTTP/HTTPS 协议传输。
- 自包含(Self-contained):JWT 的载荷中包含了所有用户需要的信息,避免了多次查询数据库。
- 简单(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: 恋水无意