Cartero cumplir con la solicitud a través de la puerta de enlace API de firma y depuración

1. Introducción

Cartero es una herramienta muy potente para las pruebas de contrato de HTTP, actualmente cartero ha proporcionado el cliente descargas del sistema de Windows / Mac / Linux, muy fácil de usar. Pero API de depuración de puerta de enlace, la necesidad de una petición HTTP se firmó a las llamadas, no se puede utilizar un rizo simple y otras herramientas contratantes completa, pero puede utilizar las herramientas del cartero Pre-solicitud de secuencias de comandos de secuencias de comandos para lograr la firma cuenta de la puerta de enlace API, lo que permite una depuración de la API función.

2. API algoritmo de puerta de enlace de la firma introdujo

Firma mecanismo de API referencia pasarela puede firmar la documentación de solicitud , una descripción breve aquí.

API firma de puerta de enlace necesita a través de la puerta de enlace API AppKey y la conducta AppSecret, Key / Secreto disponible en la consola de puerta de enlace API y asegúrese de que la API ha sido puesto en libertad, e hizo la operación no autorizada de una aplicación en particular.

Para una solicitud general, después de la API proceso de firma de puerta de enlace

2.1. Añadir los siguientes primeros auxilios para la firma y la certificación de seguridad

- Date: 日期头
- X-Ca-Key:{AppKey} 
- X-Ca-Nonce:API调用者生成的 UUID, 实现防重放功能
- Content-MD5: 当请求Body为非Form表单时,用于校验Body是否被篡改, 

2.2 La organización necesita un StringToSign cadena de firma

{HTTPMethod} + "\n" + 
{Accept} + "\n" +
{Content-MD5} + "\n" 
{Content-Type} + "\n" + 
{Date} + "\n" + 
{SignatureHeaders} + 
{UrlToSign}
  • Aceptar, Content-MD5, Content-Type, Fecha Si es necesario agregar un vacío saltos de línea "n"
  • De la forma de no sólo se forma sólo es necesario para calcular el Content-MD5, calculado como base64Encode (MD5 (body.getBytes ( "UTF-8"))
  • SignatureHeaders: En {HeaderName}: {HeaderValue} + "n" se añade de forma secuencial de acuerdo con el orden ascendente de la cadena, se recomienda añadir una firma de la primera X-Ca-Key, X-Ca-Nonce, otras implementaciones pueden primer cliente elegir si unirse a las firmas.
  • UrlToSign: Campos de formulario todos los campos queryString juntos y ordenados por nombre, si no el Content-Type aplicación urlencoded x-www-form-/ El campo Tipo de formulario aparte. El par clave-valor Ordenada añade de nuevo para dar Path UrlToSign, tales como solicitud / demo? C = 1 y a = 2, la forma es b = 3, entonces el UrlToSign = / demo? A = 2 y b = 3 y c = 1

2.3 Cálculo de las firmas adicionales y soportes relacionados con la firma

Actualmente se recomienda HMACSHA256 algoritmo de firma para calcular la firma requerida appSecret, calculado como: Firma = base 64 (HMACSHA256 (stringToSign.getBytes ( "UTF-8), appSecret)), se calcula después de la finalización También es necesario añadir los siguientes encabezados:

  • Agregar encabezado: X-Ca-Siguature: {firma}
  • Agregar encabezado: X-Ca-SignatureMethod: HMACSHA256
  • 添加 Header: X-CA-SignatureHeaders: X-Ca-Key, X-Ca-Nonce

2.4. Métodos de solución de problemas de error Firma

  • Cuando verificación de la firma falla, el servicio de puerta de enlace API StringToSign terminará en encabezado de respuesta HTTP se devuelve al cliente, clave para: X-Ca-mensaje-error, sólo para el local y el servidor de computación StringToSign volvió StringToSign comparar para encontrar el problema, la atención se devuelve desde el servidor StringToSign reemplazará a los retornos de carro #;
  • Si el servicio de cadena de firma y el cliente es consistente, compruebe la clave para el cálculo de la firma es correcta;

3. Pre-secuencia de comandos request lograr Algoritmo de firma

De acuerdo con la descripción de uno de los temas clave para lograr la API de puerta de enlace de depuración es la forma de cumplir la petición de firma, ofertas cartero pueden ser personalizados por JavaScript, mediante la lectura de Pre-Solicitud de documentos de desarrollo de secuencias de comandos, podemos implementar la API de pre-solicitud de escritura de guión pasarela función de la firma.

Nota: Utilice esta sección CARTERO Versión 7.2.0 o posterior

3.1 El uso de variables globales que añadir la cabecera de pre-firma

Pero ahora cartero no permite modificar la solicitud directamente en el guión, así que sólo podemos usar la cabeza antes de la firma y el uso de una asignación variable global se completa añadir una cabecera de la firma, necesitaremos la firma de la cabeza son prefabricados en el encabezado de la solicitud del cartero, que pueda implementado añadió a granel modo de edición, a granel Editar Haciendo referencia a continuación a la conmutación de la figura

d727c94c4c8e06ab51617de54a6cab63

Después de cambiar al modo de Edición masiva, la siguiente cadena puede copiar y pegar en el cuadro de entrada que está encerrado en {} es variables globales del cartero, reemplazamos la realización en el guión. contenido del formulario no pueden añadir cabecera Content-MD5

Date:{{Date}}
Content-MD5:{{Md5}}
X-Ca-Nonce:{{Nonce}}
X-Ca-Key:{{AppKey}}
X-Ca-Signature:{{Signature}}
X-Ca-SignatureMethod:HmacSHA256
X-Ca-Signature-Headers:{{SignatureHeaders}}

efecto figura después de pegar

bb92849f4ac664de833fe110a9f4f032

3.2 Uso de Pre-solicitud de escritura de secuencias de comandos ejecutar la función de firma

Haga clic en la posición de círculo rojo cercado, introduzca Pre-Script solicitud, copia y pega el código en el cuadro de texto debajo de ellos

Nota: Utilice esta sección CARTERO Versión 7.2.0 o posterior

311199754a861386c03e41f361ecc5ac

var appKey = "YOUR APPKEY";
var appSecret = "YOUR APPCODE";
var md5 = calcMd5();
var dateObject = Date;
var date = dateObject.toLocaleString();
var nonce = createUuid();
var textToSign = "";
var accept = "*/*";
var contentType = "";
console.log("request" + JSON.stringify(request));
if(request.headers["accept"]){
    accept = request.headers["accept"];
}
if(request.headers["content-type"]){
    contentType = request.headers["content-type"];
}
textToSign += request.method + "\n";
textToSign += accept + "\n";
textToSign += md5 + "\n";
textToSign += contentType + "\n";
textToSign += date + "\n";
var headers = headersToSign();
var signatureHeaders;
var sortedKeys = Array.from(headers.keys()).sort()
for (var headerName of sortedKeys) {
    textToSign += headerName + ":" + headers.get(headerName) + "\n";
    signatureHeaders = signatureHeaders ? signatureHeaders + "," + headerName : headerName;
}
textToSign += urlToSign();
console.log("textToSign\n" + textToSign.replace(/\n/g, "#"));
var hash = CryptoJS.HmacSHA256(textToSign, appSecret)
console.log("hash:" + hash)
var signature = hash.toString(CryptoJS.enc.Base64)
console.log("signature:" + signature)
pm.globals.set('AppKey', appKey);
pm.globals.set('Md5', md5);
pm.globals.set("Date", date);
pm.globals.set("Signature", signature);
pm.globals.set("SignatureHeaders", signatureHeaders);
pm.globals.set("Nonce", nonce);
function headersToSign() {
    var headers = new Map();
    for (var name in request.headers) {
        name = name.toLowerCase();
        if (!name.startsWith('x-ca-')) {
            continue;
        } 
        if (name === "x-ca-signature" || name === "x-ca-signature-headers" || name == "x-ca-key" || name === 'x-ca-nonce') {
            continue;
        }
        var value = request.headers[name];
        headers.set(name, value);
    }
    headers.set('x-ca-key', appKey);
    headers.set('x-ca-nonce', nonce);
    return headers;
}
function urlToSign() {
    var params = new Map();
    var contentType = request.headers["content-type"];
    if (contentType && contentType.startsWith('application/x-www-form-urlencoded')) {
       for(x in request.data){
           params.set(x, request.data[x]);
       }
    }
    var queryParam = pm.request.url.query.members;
    console.log("request.url" + JSON.stringify(pm.request.url))
    for (let i in queryParam) {
        params.set(queryParam[i].key, queryParam[i].value);
    }
    var sortedKeys = Array.from(params.keys())
    sortedKeys.sort();
    var url = "";
    for(var k of pm.request.url.path){
        url = url + "/" + k;
    }
    var qs;
    for (var k of sortedKeys) {
        var s = k + "=" + params.get(k);
        qs = qs ? qs + "&" + s : s;
        console.log("key=" + k + " value=" + params.get(k));
    }
    return qs ? url + "?" + qs : url;
}
function calcMd5() {
    var contentType = String(request.headers["content-type"]);
    console.log("data" + JSON.stringify(request.data));
    if (!JSON.stringify(request.data).startsWith('{}') && !contentType.startsWith('application/x-www-form-urlencoded')) {
        var data = request.data;
        var md5 = CryptoJS.MD5(data);
        var md5String = md5.toString(CryptoJS.enc.Base64);
        console.log("data:" + data + "\nmd5:" + md5String);
        return md5String;
    } else {
        return "";
    }
}
function createUuid() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
        return v.toString(16);
    });
}

A continuación, podemos darnos cuenta de la depuración de API Gateway.

Tenga en cuenta que esta sección del código sólo para referencia. Habrá circunstancias usuario CARTERO retroalimentación "No se puede obtener ninguna respuesta" cuando la plataforma de Windows para ejecutar este script, se recomienda que los usuarios intentan uso CARTERO depuración en el entorno MAC.

Supongo que te gusta

Origin yq.aliyun.com/articles/753758
Recomendado
Clasificación