使用 github.com/golang-jwt/jwt/v5
包创建和解析验证 JSON Web Token (JWT) 主要涉及以下几个步骤:创建一个新的 JWT,签署它,并且验证和解析一个已经签署的 JWT。
1. 安装依赖
首先,确保你已经安装了 github.com/golang-jwt/jwt/v5
包。你可以使用以下命令安装:
go get github.com/golang-jwt/jwt/v5
2. 创建一个 JWT Token
以下是创建并签署一个 JWT Token 的示例:
package main
import (
"fmt"
"time"
"github.com/golang-jwt/jwt/v5"
)
func main() {
// 定义签名方法
signingKey := []byte("your-256-bit-secret")
// 创建 token
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"sub": "1234567890", // 用户ID
"name": "John Doe", // 用户名
"iat": time.Now().Unix(), // 签发时间
"exp": time.Now().Add(time.Hour * 2).Unix(), // 过期时间 (2小时后)
})
// 使用签名方法和密钥签署 token
tokenString, err := token.SignedString(signingKey)
if err != nil {
fmt.Println("Error signing token:", err)
return
}
fmt.Println("Generated Token:", tokenString)
}
3. 解析和验证 JWT Token
解析和验证 JWT Token 的代码如下:
package main
import (
"fmt"
"github.com/golang-jwt/jwt/v5"
)
func main() {
// 定义签名密钥
signingKey := []byte("your-256-bit-secret")
// 示例 Token
tokenString := "your.jwt.token.here"
// 解析 token
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
// 确保 token 使用了预期的签名方法
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
}
return signingKey, nil
})
if err != nil {
fmt.Println("Error parsing token:", err)
return
}
// 验证 token
if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
fmt.Println("Token is valid.")
fmt.Println("User ID:", claims["sub"])
fmt.Println("User Name:", claims["name"])
fmt.Println("Issued At:", time.Unix(int64(claims["iat"].(float64)), 0))
fmt.Println("Expires At:", time.Unix(int64(claims["exp"].(float64)), 0))
} else {
fmt.Println("Invalid token.")
}
}
4. 运行程序
确保在你的环境中替换 signingKey
和 tokenString
为实际使用的值。
重要注意事项
-
密钥管理: 在生产环境中,签名密钥(
signingKey
)应该安全地存储,不能硬编码在代码中。 -
有效期: 注意 JWT 的有效期(
exp
),它决定了 token 的有效时间。确保你的应用程序正确处理 token 的过期情况。 - 错误处理: 在实际应用中,应该有完善的错误处理机制,以应对可能的 token 解析和验证失败的情况。
这段代码可以用来生成和验证基于 HMAC 的 JWT。在实际使用时,根据需求可能还需要定制化 Claims 结构或者使用其他的签名方法。