package tool import ( "crypto/ed25519" "errors" "github.com/golang-jwt/jwt/v5" ) // ParseToken 解析和验证 JWT token,使用 Ed25519 公钥进行签名验证 // // 参数: // - tokenStr: 要解析的 JWT token 字符串 // - publicKey: Ed25519 公钥,用于验证 token 签名 // // 返回值: // - claims: 解析后的 JWT 声明内容 // - err: 错误信息,如果解析或验证失败则返回错误 // // 示例: // // claims, err := ParseToken(tokenString, publicKey) // if err != nil { // // 处理错误 // } // userID := claims["user_id"].(string) func ParseToken(tokenStr string, publicKey *ed25519.PublicKey) (claims jwt.MapClaims, err error) { // 使用 jwt.Parse 解析 token,并验证签名 token, err := jwt.Parse(tokenStr, func(token *jwt.Token) (interface{}, error) { // 验证签名算法是否为 EdDSA if _, ok := token.Method.(*jwt.SigningMethodEd25519); !ok { return nil, errors.New("不支持的签名算法,期望 EdDSA") } // 返回公钥用于签名验证 return *publicKey, nil }) if err != nil { return nil, err } // 检查 token 是否有效 if !token.Valid { return nil, errors.New("无效的 token") } // 提取声明内容 claims, ok := token.Claims.(jwt.MapClaims) if !ok { return nil, errors.New("无法解析声明内容") } return claims, nil }