Golang token的生成和解析
使用第三方库来实现
go get github.com/dgrijalva/jwt-go
golang代码
package main
import (
"fmt"
"time"
"github.com/dgrijalva/jwt-go"
)
func main() {
// 生成Token
tokenString := generateToken("example-user", "secret-key")
fmt.Println("Token:", tokenString)
// 解密Token
claims, err := parseToken(tokenString, "secret-key")
if err != nil {
fmt.Println("解密Token失败:", err)
return
}
// 获取Token中的自定义声明
if username, ok := claims["username"].(string); ok {
fmt.Println("Username:", username)
}
}
func generateToken(username string, secretKey string) string {
// 创建一个Token对象
token := jwt.New(jwt.SigningMethodHS256)
// 设置Token的自定义声明
claims := token.Claims.(jwt.MapClaims)
claims["username"] = username
claims["exp"] = time.Now().Add(time.Hour * 24).Unix() // 设置Token的过期时间
// 使用密钥对Token进行签名,生成最终的Token字符串
tokenString, _ := token.SignedString([]byte(secretKey))
return tokenString
}
func parseToken(tokenString string, secretKey string) (jwt.MapClaims, error) {
// 解析Token字符串
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
return []byte(secretKey), nil
})
if err != nil {
return nil, err
}
// 验证Token的签名方法是否有效
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("无效的签名方法:%v", token.Header["alg"])
}
// 返回Token中的声明部分
if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
return claims, nil
}
return nil, fmt.Errorf("无效的Token")
}
消息中间件
func JWT() gin.HandlerFunc {
return func(c *gin.Context) {
c.Abort()
c.Next()
}
}