Golang中如何设置JSON Web Token(JWT)的过期时间
Golang中如何设置JSON Web Token(JWT)的过期时间 大家好
有谁知道如何使用Go语言验证JWT JSON令牌的过期日期。 我的环境是Tyk API网关。
谢谢
难道不应该是 time.Now().Before(time.UnixMicro(jwtexp*1000000)) 吗?
exp过期时间标识了在此时间点及之后,JWT 不得 被接受处理。该值必须是一个 NumericDate:[9] 可以是整数或小数,表示自 1970-01-01 00:00:00Z 以来的秒数。
time.Now().Before(time.UnixMicro(jwtexp*1000000))
更多关于Golang中如何设置JSON Web Token(JWT)的过期时间的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
JSON Web Token(JWT,发音与单词"jot"相同,读作 /dʒɒt/)是一项提议的互联网标准,用于创建带有可选签名和/或可选加密的数据,其有效载荷包含声明某些声明的JSON。令牌使用私钥或公钥/私钥进行签名。
例如,服务器可以生成一个包含"以管理员身份登录"声明的令牌,并将其提供给客户端。客户端随后可以使用该令牌来证明其是以管理员身份登录的…
这是一个插件教程:
使用插件编写模块化Go程序
隐藏在Go 1.8版本引入的众多重要特性之中的是一个新的Go插件系统。此功能让程序员能够…
阅读时间:7分钟
在Go中设置和验证JWT的过期时间,可以使用github.com/golang-jwt/jwt/v5库。以下是具体实现:
1. 生成带过期时间的JWT令牌:
package main
import (
"fmt"
"time"
"github.com/golang-jwt/jwt/v5"
)
func generateToken(secretKey string) (string, error) {
// 创建声明,设置过期时间
claims := jwt.MapClaims{
"username": "john_doe",
"exp": time.Now().Add(24 * time.Hour).Unix(), // 24小时后过期
"iat": time.Now().Unix(),
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
return token.SignedString([]byte(secretKey))
}
2. 验证JWT令牌(包含过期时间验证):
func validateToken(tokenString, secretKey string) (*jwt.Token, error) {
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
// 验证签名方法
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
}
return []byte(secretKey), nil
})
if err != nil {
return nil, err
}
// 自动验证过期时间(exp claim)
if !token.Valid {
return nil, fmt.Errorf("token is invalid")
}
return token, nil
}
3. 在Tyk API网关环境中使用:
Tyk通常会自动验证JWT的过期时间。如果你需要自定义验证逻辑:
// Tyk中间件示例
func JWTMiddleware(secretKey string) gin.HandlerFunc {
return func(c *gin.Context) {
authHeader := c.GetHeader("Authorization")
if authHeader == "" {
c.JSON(401, gin.H{"error": "Authorization header required"})
c.Abort()
return
}
tokenString := strings.Replace(authHeader, "Bearer ", "", 1)
token, err := validateToken(tokenString, secretKey)
if err != nil {
c.JSON(401, gin.H{"error": "Invalid token: " + err.Error()})
c.Abort()
return
}
// 获取声明信息
if claims, ok := token.Claims.(jwt.MapClaims); ok {
c.Set("username", claims["username"])
}
c.Next()
}
}
4. 自定义过期时间验证(如果需要手动检查):
func checkTokenExpiration(tokenString, secretKey string) error {
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
return []byte(secretKey), nil
}, jwt.WithValidMethods([]string{"HS256"}))
if err != nil {
return err
}
// 手动提取并验证过期时间
if claims, ok := token.Claims.(jwt.MapClaims); ok {
if exp, ok := claims["exp"].(float64); ok {
expTime := time.Unix(int64(exp), 0)
if time.Now().After(expTime) {
return fmt.Errorf("token expired at %v", expTime)
}
} else {
return fmt.Errorf("exp claim not found or invalid")
}
}
return nil
}
5. 使用jwt.RegisteredClaims(推荐):
type CustomClaims struct {
Username string `json:"username"`
jwt.RegisteredClaims
}
func generateTokenWithRegisteredClaims(secretKey string) (string, error) {
claims := CustomClaims{
Username: "john_doe",
RegisteredClaims: jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(time.Now().Add(24 * time.Hour)),
IssuedAt: jwt.NewNumericDate(time.Now()),
NotBefore: jwt.NewNumericDate(time.Now()),
Issuer: "my-app",
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
return token.SignedString([]byte(secretKey))
}
在Tyk网关中,确保在API定义中正确配置了JWT验证,Tyk会自动处理过期时间验证。如果需要自定义逻辑,可以在Tyk的中间件或自定义验证函数中实现上述代码。



