package main
import (
"crypto/ecdsa"
"crypto/md5"
"crypto/x509"
"encoding/hex"
"encoding/json"
"encoding/pem"
"fmt"
"log"
"time"
"github.com/golang-jwt/jwt/v5"
)
const (
userID = "82f04bce-e088-11ee-acd2-299d225f5178"
apiKey = "fdef711f-8c6b-476d-b1cf-c9c340422763"
privateKeyPEM = `-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIO8Bh+h4TkpoA1yVa0V1lX85UeAnXd2bmgFs9k67X4UKoAoGCCqGSM49
AwEHoUQDQgAE2hsBhwR3Od4CgBnT/DVZH+SBsyn74IMABdmcjYZOJIbVySYYSQGq
C5jvT8zoE5GDlQEHX0j7vKGrZO4YXnwlxQ==
-----END EC PRIVATE KEY-----`
)
func generateAuthHeader(method string, url string, bodyDict map[string]interface{}) (map[string]string, error) {
jsonBodyBytes, err := json.Marshal(bodyDict)
if err != nil {
return nil, fmt.Errorf("❌ erro ao serializar JSON: %w", err)
}
hasher := md5.New()
hasher.Write(jsonBodyBytes)
bodyMD5Hash := hex.EncodeToString(hasher.Sum(nil))
timestampNow := time.Now().UTC().Format("2006-01-02T15:04:05.000Z")
ecPrivateKey, err := loadECPrivateKeyFromPEMString(privateKeyPEM)
if err != nil {
return nil, fmt.Errorf("❌ erro ao carregar chave privada: %w", err)
}
claims := jwt.MapClaims{
"payload_md5": bodyMD5Hash,
"timestamp": timestampNow,
"method": method,
"url": url,
"user_id": userID,
"api_key": apiKey,
}
token := jwt.NewWithClaims(jwt.SigningMethodES256, claims)
token.Header["typ"] = "JWT"
encodedToken, err := token.SignedString(ecPrivateKey)
if err != nil {
return nil, fmt.Errorf("❌ erro ao assinar token: %w", err)
}
log.Println("✅ Token JWT gerado com sucesso!")
return map[string]string{"Authorization": encodedToken}, nil
}
func loadECPrivateKeyFromPEMString(pemString string) (*ecdsa.PrivateKey, error) {
block, _ := pem.Decode([]byte(pemString))
if block == nil {
return nil, fmt.Errorf("falha ao decodificar o bloco PEM")
}
privateKey, err := x509.ParseECPrivateKey(block.Bytes)
if err != nil {
return nil, fmt.Errorf("falha ao analisar a chave privada EC: %w", err)
}
return privateKey, nil
}