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.
Diversas APIs da Rapid utilizam um processo de autenticação OAuth 2.0 em vez de autenticação por assinatura.
Leia mais sobre autenticação OAuth 2.0
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=yourUNIXTimestampSeu 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=yourAPIKey,Signature=Mgup2Azf,timestamp=1476739212Como 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=" + timestampRuby
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=" + timestampComo 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.