Autenticação da assinatura
É necessário aplicar o método de autenticação de assinaturas da Rapid para todas as solicitações de API.
Autenticação e acesso da chave de API
Você vai usar o cabeçalho da autorização de HTTP para transmitir a sua chave de API e um hash de assinatura SHA-512 com cada solicitação. O hash de assinatura consiste na sua chave de API, o seu segredo compartilhado e um carimbo de data/hora UNIX.
Não tem uma chave de API? Encontre informações e instruções sobre como configurar a sua conta na página de introdução.
Como criar o seu cabeçalho de autorização
A Rapid espera que o seu cabeçalho de autorização use o formato abaixo. Observe o prefixo EAN
obrigatório. Esse prefixo assegura que as regras de autorização corretas sejam aplicadas na sua solicitação.
Authorization: EAN APIKey=yourAPIKey,Signature=sha512Hash,timestamp=yourUNIXTimestamp
Seu valor de signature
é o hash SHA-512 sem sal da concatenação da sua chave de API + segredo compartilhado + carimbo de data/hora UNIX em segundos.
O seu valor de timestamp
deve ser o mesmo valor usado para gerar a sua signature
. Se um valor diferente de carimbo de data/hora for apresentado, a Rapid não vai verificar o seu valor de hash de assinatura e a sua solicitação vai ser rejeitada.
Aqui está um exemplo de cabeçalho de autorização completo:
Authorization: EAN APIKey=dkc4wrkp7w58wx5v2jxen2kx,Signature=Mgup2Azf,timestamp=1476739212
Como verificar o seu cabeçalho de autorização
Teste o seu próprio código com o gerador de assinatura da Rapid antes de fazer solicitações de teste.
Observação: sincronização de relógio NTP
A Rapid sincroniza os tempos do servidor interno usando o protocolo do tempo de rede (NTP). Se você também usar o NTP, não devem ocorrer problemas de sincronização do relógio. A maioria dos sistemas operacionais modernos é compatível com isso ou com serviços de sincronização de tempo similares. Verifique a documentação do seu sistema operacional. O sistema aceita carimbos de data/hora de até cinco minutos antes ou depois do carimbo de data/hora do servidor, a fim de acomodar variações aceitáveis entre relógios.
Exemplos de código de geração de assinatura
PHP
$apiKey = "abcdefg";
$secret = "1a2bc3";
$timestamp = time();
$authHeader = 'Authorization: EAN APIKey=' . $apiKey . ',Signature=' . hash("sha512", $apiKey.$secret.$timestamp) . ',timestamp=' . time();
JavaScript
var crypto = require('crypto');
var request = require('request');
var apiKey = '123';
var secret = '123';
var timestamp = Math.round(new Date().getTime() / 1000);
var hash = crypto.createHash('sha512').update(apiKey + secret + timestamp).digest('hex');
var authHeaderValue = 'EAN APIKey=' + apiKey + ',Signature=' + hash + ',timestamp=' + timestamp;
Java
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Timestamp;
import java.util.Date;
String apiKey = "123";
String secret = "123";
Date date= new java.util.Date();
Long timestamp = (date.getTime() / 1000);
String signature = null;
try {
String toBeHashed = apiKey + secret + timestamp;
MessageDigest md = MessageDigest.getInstance("SHA-512");
byte[] bytes = md.digest(toBeHashed.getBytes("UTF-8"));
StringBuilder sb = new StringBuilder();
for(int i=0; i< bytes.length ;i++){
sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
}
signature = sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String authHeaderValue = "EAN APIKey=" + apiKey + ",Signature=" + signature + ",timestamp=" + timestamp;
Python
#!/usr/bin/env python
import hashlib
import time
apiKey = "123"
secret = "123"
timestamp = str(int(time.time()));
authHeaderValue = "EAN APIKey=" + apiKey + ",Signature=" + hashlib.sha512(apiKey+secret+timestamp).hexdigest() + ",timestamp=" + timestamp
Ruby
require 'digest'
apiKey="123"
secret="123"
timestamp = Time.now.to_i
toBeHashed = "#{apiKey}#{secret}#{timestamp}"
signature = Digest::SHA2.new(512).hexdigest(toBeHashed)
authHeaderValue = "EAN APIKey=#{apiKey},Signature=#{signature},timestamp=#{timestamp}"
C#
String apiKey = "123";
String secret = "123";
TimeSpan epochTicks = new TimeSpan(new DateTime(1970, 1, 1).Ticks);
TimeSpan unixTicks = new TimeSpan(DateTime.UtcNow.Ticks) - epochTicks;
double unixTime = (int)unixTicks.TotalSeconds;
var toBeHashed = apiKey + secret + unixTime;
var bytes = System.Text.Encoding.UTF8.GetBytes(toBeHashed);
using (var hash = System.Security.Cryptography.SHA512.Create())
{
var hashedInputBytes = hash.ComputeHash(bytes);
var hashedInputStringBuilder = new System.Text.StringBuilder(128);
foreach (var b in hashedInputBytes)
hashedInputStringBuilder.Append(b.ToString("X2"));
var signature = hashedInputStringBuilder.ToString();
var authHeaderValue = "EAN APIKey=" + apiKey + ",Signature=" + signature +",timestamp=" + unixTime;
}
Perl
use strict;
use Crypt::Digest::SHA512 qw(sha512_hex);
my $apiKey = '123';
my $secret = '123';
my $timestamp = time;
my $sig = sha512_hex($apiKey . $secret . $timestamp);
my $authHeaderValue = "EAN APIKey=".$apiKey.",Signature=".$sig.",timestamp=".$timestamp;
print $authHeaderValue;
GoLang
apiKey := "123"
secret := "123"
timestamp := strconv.FormatInt(time.Now().Unix(), 10)
c := sha512.New()
c.Write([]byte(apiKey + secret + timestamp))
signature := hex.EncodeToString(c.Sum(nil))
authHeaderValue := "EAN APIKey=" + apiKey + ",Signature=" + signature + ",timestamp=" + timestamp
Como proteger o seu segredo compartilhado
O segredo compartilhado concedido a você é crucial para a segurança dos seus dados de solicitação e deve ser tratado como uma senha. Nunca inclua o valor bruto em nenhum site ou código de aplicativo acessível de maneira pública. Você vai receber o seu segredo compartilhado e a sua chave de API quando tiver aprovação para integrar a Rapid.