Just my personal API project in GO.

gdias c3d9dfcc21 ADD: Implement the edit events route 2 meses atrás
cmd c3d9dfcc21 ADD: Implement the edit events route 2 meses atrás
db 34832cc581 INITIAL: Initial project GoApi with HMAC 3 meses atrás
internal c3d9dfcc21 ADD: Implement the edit events route 2 meses atrás
.env.example 34832cc581 INITIAL: Initial project GoApi with HMAC 3 meses atrás
.gitignore 34832cc581 INITIAL: Initial project GoApi with HMAC 3 meses atrás
README.md c743000516 FIX: fix README-2 3 meses atrás
go.mod 34832cc581 INITIAL: Initial project GoApi with HMAC 3 meses atrás
go.sum 34832cc581 INITIAL: Initial project GoApi with HMAC 3 meses atrás

README.md

GoApi

Este projeto é uma API simples para aprendizado em GoLang seguindo a estrutura utilizada por padrão em empresas que utilizam Go.

Como rodar o projeto

Instale as dependências e atualize o go.mod

 go get github.com/joho/godotenv
 go get github.com/mattn/go-sqlite3
 go mod tidy

Inicie o servidor de desenvolvimento

go run ./cmd/GoApi/main.go

A aplicação estará disponível em http://localhost:8080 (ou similar, conforme o terminal indicar).

HMAC

Para funcionamento desse middleware, é necessário adicionar as seguintes headers na requisição:

  • X-Timestamp: unix seconds
  • X-Signature: assinatura em hex

Alem de adicionar um pre-request script no Postman para gerar a assinatura.

// Lê dados do ambiente
const secret = pm.environment.get("hmac_secret");
if (!secret) {
  throw new Error("Env var 'hmac_secret' não definida no Postman.");
}

// Método e path exatos
const method = pm.request.method; // GET/POST
// Garante que usamos somente o path (sem query)
const url = new URL(pm.request.url.toString());
const path = url.pathname;

// Timestamp em segundos
const ts = Math.floor(Date.now() / 1000).toString();

// Corpo bruto (para GET deve ser string vazia)
let body = "";
if (method !== "GET" && pm.request.body && pm.request.body.raw) {
  // Use exatamente o que vai no corpo da requisição
  body = pm.request.body.raw;
}

// Monta a mensagem canônica
const msg = method + "\n" + path + "\n" + ts + "\n" + body;

// Calcula HMAC-SHA256 em hex usando CryptoJS (nativo do Postman)
const signature = CryptoJS.HmacSHA256(msg, secret).toString(CryptoJS.enc.Hex);

// Define headers
pm.request.headers.upsert({ key: "X-Timestamp", value: ts });
pm.request.headers.upsert({ key: "X-Signature", value: signature });