Verificación por firma

Es necesario emplear el método de verificación por firma de Rapid en todas las solicitudes de API.

Verificación de la clave para la API y acceso

Debes usar el encabezado HTTP de autorización para transmitir la clave para la API y un hash de firma SHA-512 con cada solicitud. El hash de firma consta de tu clave para la API, el secreto compartido y la marca de tiempo UNIX.

¿No tienes una clave para la API? Puedes consultar más información e instrucciones para configurar tu cuenta en la página Primeros pasos.

Creación del encabezado de autorización

Rapid espera que el encabezado de tu autorización utilice el formato que aparece a continuación; toma nota del prefijo EAN necesario. Este prefijo garantiza que se apliquen las normas de autorización correctas a tu solicitud.

Authorization: EAN APIKey=yourAPIKey,Signature=sha512Hash,timestamp=yourUNIXTimestamp

El valor de tu signature es el hash SHA-512 sin sal de la concatenación de tu clave para la API + secreto compartido + marca de tiempo UNIX expresada en segundos.

Tu valor timestamp debe ser el mismo valor utilizado para generar tu signature. Si se facilita un valor de marca de tiempo diferente, Rapid no podrá verificar el valor del hash de tu firma, y tu solicitud será rechazada.

Este es un ejemplo de un encabezado de autorización que está completo:

Authorization: EAN APIKey=dkc4wrkp7w58wx5v2jxen2kx,Signature=Mgup2Azf,timestamp=1476739212

Verificación del encabezado de autorización

Antes de realizar las solicitudes de prueba, comprueba tu propio código en el generador de firmas de Rapid.

Nota: Sincronización con el reloj NTP

Rapid sincroniza el reloj interno del servidor con Network Time Protocol (NTP). Si utilizas también NTP, no debería haber problemas de sincronización del reloj. La mayor parte de los sistemas operativos modernos utiliza este servicio de sincronización o uno similar. Compruébelo en la documentación de su sistema operativo. El sistema acepta marcas de tiempo de hasta cinco minutos antes o después de la marca de tiempo del servidor, con el fin de compensar las desviaciones del reloj que sean razonables.

Ejemplos de código de generación de firmas

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

Protección del secreto compartido

El secreto compartido que se te entregue es esencial para la seguridad de los datos de tus solicitudes; trátalo como si fuera una contraseña. No incluyas nunca el valor sin formato en ningún sitio accesible públicamente ni en el código de una aplicación. Te proporcionarán tu secreto compartido y tu clave para la API cuando recibas la aprobación para integrarte en Rapid.

¿Te ha resultado útil esta página?
¿Cómo podemos mejorar este contenido?
�Gracias por ayudarnos a mejorar!