Estos contenidos se han traducido de forma automática para su comodidad, pero Huawei Cloud no garantiza la exactitud de estos. Para consultar los contenidos originales, acceda a la versión en inglés.
Centro de ayuda/ API Gateway/ Preguntas frecuentes/ Autenticación de API/ Errores comunes relacionados con la información de autenticación de IAM
Actualización más reciente 2023-10-18 GMT+08:00

Errores comunes relacionados con la información de autenticación de IAM

Puede encontrar los siguientes errores relacionados con la información de autenticación de IAM:

Incorrect IAM authentication information: verify aksk signature fail

{    
  "error_msg": "Incorrect IAM authentication information: verify aksk signature fail, ......   
  "error_code": "APIG.0301", 
  "request_id": "******" 
}

Causa posible

El algoritmo de firma es incorrecto, y la firma calculada por el cliente es diferente de la calculada por APIG.

Solución

Método 1: Ver logs.

  1. Obtener la canonicalRequest calculada por APIG.

    Obtenga request_id del cuerpo del mensaje de error, busque error.log (puede ver este archivo en CLS) del nodo shubao basado en el request_id y obtenga canonicalRequest de error.log.
    2019/01/26 11:34:27 [error] 1211#0: *76 [lua] responses.lua:170: rewrite(): 473a4370fbaf69e42f9da243eb8f8c52;app-1;Incorrect IAM authentication information: verify signature fail;SDK-HMAC-SHA256 Access=071fe245-9cf6-4d75-822d-c29945a1e06a, SignedHeaders=host;x-sdk-date, Signature=b2ef2cddcef89cbfe22974c988909c1a94b1ac54114c30b8fe083d34a259e0f5;canonicalRequest:GET
    /app1/
    
    host:test.com
    x-sdk-date:20190126T033427Z
    
    host;x-sdk-date
    e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855, client: 192.168.0.1, server: shubao, request: "GET /app1 HTTP/1.1", host: "test.com"

  2. Obtenener la canonicalRequest calculada por el cliente imprimiendo logs o usando interrupciones de depuración. En la siguiente tabla se describen las funciones utilizadas para calcular la canonicalRequest en los SDK de diferentes idiomas.

    Tabla 1 Funciones para calcular la canonicalRequest en los SDK de idiomas comunes

    Idioma

    Función

    Java

    Función de Sign en com.cloud.sdk.auth.signer.DefaultSigner.class de libs/java-sdk-core-*.jar

    C

    Función sig_sign de signer.c

    C++

    Función Signer::createSignature de signer.cpp.

    C#

    Función de Sign en signer.cs

    Go

    Función de Sign en el signer.go

    JavaScript

    Función de Signer.prototype.Sign de signer.js

    Python

    Función de Sign en el signer.py

    PHP

    Función de Sign en el signer.php

    Ejemplo: canonicalRequest obtenida en una interrupción de depuración

    POST 
    /app1/  
    
    host:test.com 
    x-sdk-date:20190126T033950Z  
    
    host;x-sdk-date 
    e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

  3. Compruebe si el canonicalRequest de 1 es el mismo que el de 2.

    • Sí: Compruebe si las AK y SK son correctas, por ejemplo, sin espacios.
    • No:
      • Diferente en la línea 1: El método de solicitud debe ser el mismo.
      • Diferente en la línea 2: La ruta de la solicitud debe ser la misma.
      • Diferente en la línea 3: Los parámetros de solicitud deben ser los mismos.
      • Diferente en las líneas 4 a 5: El encabezado de solicitud debe ser el mismo en cada línea.
      • Diferente en la línea 7: El número de parámetros de cabecera de solicitud debe ser el mismo que el número de líneas de cabecera de solicitud.
      • Diferente en la línea 8: El cuerpo de la solicitud debe ser el mismo.
    Tabla 2 canonicalRequest de APIG y un cliente

    N.º de línea

    Parámetro

    APIG

    Cliente

    1

    Request method

    GET

    POST

    2

    Request path

    /app1/

    /app1/

    3

    Request parameters

    No hay

    No hay

    4

    Request header

    host:test.com

    host:test.com

    5

    Request header

    x-sdk-date:20190126T033427Z

    x-sdk-date:20190126T033950Z

    6

    Blank line

    -

    -

    7

    Request header parameters

    host;x-sdk-date

    host;x-sdk-date

    8

    Request body hash value

    e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

    e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Method 2: Compare the local signature with the obtained one.

  1. Descargue el SDK de JavaScript, vea el SDK de firma visualizado y obtenga la firma.
  2. Descomprima el paquete y abra el archivo demo.html usando un navegador.
  3. Obtenga el valor de x-sdk-date y compruebe si la diferencia entre este valor y la hora actual es de 15 minutos.

    1. Presione F12 en el teclado y elija Sources > Snippets > New snippet.
    2. Copie el siguiente código en el fragmento de script de la derecha, haga clic con el botón derecho en el nombre del fragmento de la izquierda y seleccione Run en el menú contextual. El valor que se muestra en la ficha Console es el valor de x-sdk-date.
    function twoChar(s) {
        if (s >= 10) {
            return "" + s
        } else {
            return "0" + s
        }
    }
    
    function getTime() {
        var date = new Date();
        return "" + date.getUTCFullYear() + twoChar(date.getUTCMonth() + 1) + twoChar(date.getUTCDate()) + "T" +
            twoChar(date.getUTCHours()) + twoChar(date.getUTCMinutes()) + twoChar(date.getUTCSeconds()) + "Z"
    }
    getTime()

  4. Agregue x-sdk-date a Headers y establezca otros parámetros y haga clic en Debug para obtener la firma.

    Para todas las solicitudes excepto get, delete y head, agregue un cuerpo en el área Body utilizando el mismo formato que un cuerpo de solicitud real.

  5. Copie el comando curl en la figura de 4, ejecútelo en una interfaz de línea de comandos y, a continuación, vaya al siguiente paso.

    curl -X GET "http://192.168.0.1:10000/get" -H "X-Sdk-Date: 20221208T015751Z" -H "host: 192.168.0.1:10000" -H "Authorization: SDK-HMAC-SHA256 Access=6cc7e0042e1645c4bc954368d3b495a8, SignedHeaders=host;x-sdk-date, Signature=488409e25642fd03753a16238f89e35b466e93b3470160a9e894f53e79f2108a" -d $''

    Si se utiliza un autorizador personalizado, reemplace Authorization en el comando curl por el nombre del autorizador.

  6. Compare la firma en el código local con la firma visualizada de JavaScript.

    Por ejemplo, compruebe si los valores de canonicalRequest, stringToSign y authorizationHeader en el código de firma Java son los mismos que en la firma visualizada de JavaScript.

Incorrect IAM authentication information: AK access failed to reach the limit, forbidden

{    
  "error_msg": "Incorrect IAM authentication information: AK access failed to reach the limit,forbidden." ......   
  "error_code": "APIG.0301", 
  "request_id": "******" 
}

Causas posibles

  • El cálculo de la firma AK/SK es incorrecto. Resuelva el problema haciendo referencia a Incorrect IAM authentication information: verify aksk signature fail.
  • Las AK y SK no coinciden.
  • La autenticación de AK/SK falla durante más de cinco veces consecutivas, y el par AK/SK se bloquea durante cinco minutos. (Las solicitudes de autenticación se rechazan dentro de este período).
  • Se utiliza un token caducado para la autenticación de token.

Incorrect IAM authentication information: decrypt token fail

{
  "error_msg": "Incorrect IAM authentication information: decrypt token fail",
  "error_code": "APIG.0301",
  "request_id": "******"
}

Causa posible

El token no se puede analizar para la autenticación de IAM de la API.

Solución

  • Compruebe si el token es correcto.
  • Compruebe si el token se ha obtenido en el entorno donde se invoca a la API.

Incorrect IAM authentication information: Get secretKey failed

{
"error_msg": "Incorrect IAM authentication information: Get secretKey failed,ak:******,err:ak not exist",
"error_code": "APIG.0301",
"request_id": "******"
}

Causa posible

La AK utilizada para la autenticación de IAM de la API no existe.

Solución

Compruebe si la AK es correcta.