Quando se trata de autenticar clientes de API, uma solução comum é fornecer uma API Key para cada um dos seus clientes.
Já que a API Key — enviada em cada chamada — pode ser roubada e usada por uma terceira parte maliciosa em nome do seu app, recomendamos fornecer uma chave secreta junto com a API Key (também conhecida como identificador de cliente).
O seguinte método é aplicável ao conectar uma API a partir de um servidor e não de um cliente.
Esta chave secreta será usada para criar um token de acesso temporário, que é único para cada chamada e será enviado junto com sua API Key. Se a mesma chamada for repetida, isso gerará um erro, pois o token de acesso destina-se a ser usado apenas uma vez.
Aqui está o que seus apps precisam fazer para cada chamada:
- Pegar a API Key pública
- Pegar a Chave Secreta (nunca deve ser compartilhada)
- Gerar um “nonce“, que é um número aleatório que só pode ser usado uma vez
- Gerar o “timestamp“, que é o timestamp UNIX
- Gerar o token de acesso, que é criado através do hash da API Key, usando o algoritmo de hash de sua escolha: $apikey = hash_hmac(‘sha1’, $APIKey, $SecretKey.$timestamp.$nonce); Para gerar a variante HMAC do resumo da mensagem, agrupamos a chave secreta, timestamp e nonce.
- Conectamos a API enviando a API Key, o timestamp, o nonce e o token de acesso gerado. Cuidado para nunca enviar sua chave secreta!
Do lado do servidor, aqui está a proteção que você precisa colocar em prática:
- Se o parâmetro de timestamp recebido for mais antigo que 15 minutos (ou qualquer outro valor arbitrário), descarte a conexão.
- Se o timestamp recebido estiver dentro do intervalo de 15 minutos, verifique se a combinação de “API Key”, “token de acesso”, “nonce” e “timestamp” já existe em seu cache de memória. Se existir, descarte a conexão. Se não, adicione esta entrada ao seu cache e processe a conexão.
- Certifique-se de que as entradas em seu cache expiram automaticamente após 15 minutos para não sobrecarregar sua memória.
Como você pode ver, este método depende da capacidade de gerar o token de acesso sem divulgar a chave secreta. Assim, ele funciona bem para uma chamada de API a partir de um servidor, mas não é relevante para conectar APIs de um cliente JavaScript.
Autor:
Colaborador: Stephane Castellani