Protegendo sua API com HMAC
Como seu serviço backend pode fazer chamadas seguras para a API de Serviço do Draft Auth.
Opção 1: Usar @draftauth/client (Recomendado)
Esta biblioteca Node.js simplifica o processo.
-
Instalação:
Terminal window pnpm add @draftauth/client # Ou npm/yarn -
Uso:
import { createDraftauthServiceClient } from "@draftauth/client";const client = createDraftauthServiceClient({apiUrl: "YOUR_DRAFTAUTH_API_URL", // Ex: http://localhost:3000apiKeyId: "YOUR_API_KEY_ID", // Ex: sk_myapp_...apiSecretKey: "YOUR_SECRET_KEY", // O segredo obtido na criação da key});async function checkUserAccess(userId: string) {try {const status = await client.getUserAccess({ userId });console.log(`User ${userId} access status: ${status}`);return status;} catch (error) {console.error("Error checking user access:", error);// Lidar com o erro (ex: usuário não encontrado, chave inválida)}}// Chamar outras funções: client.setUserAccess, client.assignRoleToUser, etc.
Opção 2: Implementação Manual (Exemplo Conceitual)
Se não estiver usando Node.js ou o client, você precisará implementar a lógica HMAC manualmente:
- Obtenha
apiKeyIdeapiSecretKey. - Prepare a Requisição:
- Defina o Método (GET, POST, etc.).
- Construa a URL completa (com query params).
- Obtenha o Timestamp atual (ms).
- Se POST/PUT/PATCH: Calcule o hash SHA-256 do corpo (body), converta para base64 e crie o header
Digest: SHA-256=<hash-base64>. - Se GET/DELETE: O
Digestpode ser omitido ou vazio.
- Construa a String para Assinar:
UseMETHOD\n/path?query\nTIMESTAMP\nDIGEST_HEADER_VALUE
\ncomo separador. Use o valor completo do headerDigest(incluindoSHA-256=). - Calcule a Assinatura HMAC:
- Use HMAC-SHA256 com o
apiSecretKeysobre a “String para Assinar”. - Converta o resultado para base64.
- Use HMAC-SHA256 com o
- Monte os Headers:
X-Api-Key-Id: SeuapiKeyId.X-Request-Timestamp: O timestamp usado.X-Signature: A assinatura HMAC calculada em base64.Digest: O headerDigest(se aplicável).Content-Type: application/json(se houver corpo).Accept: application/json.
- Envie a Requisição: Faça a chamada HTTP com os headers e corpo montados.