ParseToken.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package tool
  2. import (
  3. "crypto/ed25519"
  4. "errors"
  5. "github.com/golang-jwt/jwt/v5"
  6. )
  7. // ParseToken 解析和验证 JWT token,使用 Ed25519 公钥进行签名验证
  8. //
  9. // 参数:
  10. // - tokenStr: 要解析的 JWT token 字符串
  11. // - publicKey: Ed25519 公钥,用于验证 token 签名
  12. //
  13. // 返回值:
  14. // - claims: 解析后的 JWT 声明内容
  15. // - err: 错误信息,如果解析或验证失败则返回错误
  16. //
  17. // 示例:
  18. //
  19. // claims, err := ParseToken(tokenString, publicKey)
  20. // if err != nil {
  21. // // 处理错误
  22. // }
  23. // userID := claims["user_id"].(string)
  24. func ParseToken(tokenStr string, publicKey *ed25519.PublicKey) (claims jwt.MapClaims, err error) {
  25. // 使用 jwt.Parse 解析 token,并验证签名
  26. token, err := jwt.Parse(tokenStr, func(token *jwt.Token) (interface{}, error) {
  27. // 验证签名算法是否为 EdDSA
  28. if _, ok := token.Method.(*jwt.SigningMethodEd25519); !ok {
  29. return nil, errors.New("不支持的签名算法,期望 EdDSA")
  30. }
  31. // 返回公钥用于签名验证
  32. return *publicKey, nil
  33. })
  34. if err != nil {
  35. return nil, err
  36. }
  37. // 检查 token 是否有效
  38. if !token.Valid {
  39. return nil, errors.New("无效的 token")
  40. }
  41. // 提取声明内容
  42. claims, ok := token.Claims.(jwt.MapClaims)
  43. if !ok {
  44. return nil, errors.New("无法解析声明内容")
  45. }
  46. return claims, nil
  47. }