| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- 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
- }
|