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.

Esta página foi útil?
Como podemos melhorar esse conteúdo?
Agradecemos por nos ajudar a melhorar.