Cloud-native API Gateway admite autenticación global, autenticación a nivel de ruta y autorización de consumidores. Este tema describe cómo configurar cada método de autenticación y autorizar a los consumidores para acceder a rutas y API específicas.
Contexto
La autenticación global es adecuada para escenarios B2C, como el inicio de sesión unificado. La autenticación de consumidores para rutas y API se ajusta mejor a escenarios B2B, como otorgar acceso a API a socios comerciales.
|
Elemento |
Autenticación global |
Autenticación de rutas y autorización de consumidores |
|
Casos de uso |
Escenarios B2C, como la autenticación de inicio de sesión unificado. |
Escenarios B2B, como otorgar acceso a API a socios comerciales. |
|
Diferencia clave |
La autorización se habilita automáticamente al activar la autenticación. |
Después de habilitar la autenticación, debe configurar la autorización por separado. |
|
Ruta de configuración |
. |
|
|
Configuración del método de autenticación (ejemplo de autenticación JWT) |
|
|
|
Configuración del método de autorización |
Al crear una configuración, proporcione una lista de Domain Name y Path para una lista de bloqueados o de permitidos.
|
|
Notas de uso
Una vez que habilita la autenticación de consumidores, la directiva entra en vigor inmediatamente. Si no se configura ningún consumidor o regla de autorización para una ruta o API publicada, la puerta de enlace deniega todas las solicitudes de forma predeterminada.
Uso de autenticación y autorización de consumidores
Autenticación JWT
Flujo de trabajo de autenticación JWT
El cliente envía una solicitud de autenticación a la puerta de enlace, generalmente con el nombre de usuario y la contraseña del usuario final.
La puerta de enlace reenvía la solicitud al servicio de backend.
El backend valida las credenciales. Tras una validación exitosa, genera un token con una clave privada y devuelve el token a la puerta de enlace.
La puerta de enlace devuelve el token al cliente. El cliente almacena este token en caché localmente.
El cliente envía una solicitud de negocio con el token almacenado en caché a la puerta de enlace.
La puerta de enlace verifica el token mediante la clave pública configurada. Si es válido, reenvía la solicitud al backend.
El backend procesa la solicitud y devuelve una respuesta.
La puerta de enlace reenvía la respuesta al cliente.
Las siguientes secciones describen cómo generar un token, enviar una solicitud a la puerta de enlace y validar el token mediante la clave pública configurada.
Generar un token
El siguiente ejemplo en Java muestra cómo generar un token. Puede utilizar herramientas similares en otros lenguajes.
-
Cree un proyecto Maven y agregue la dependencia.
Agregue la siguiente dependencia al proyecto:
<dependency> <groupId>org.bitbucket.b_c</groupId> <artifactId>jose4j</artifactId> <version>0.7.0</version> </dependency> -
Elija un método para generar el token.
Puede generar un token mediante una clave simétrica o asimétrica.
Clave simétrica
Código de ejemplo:
package org.example; import java.io.UnsupportedEncodingException; import java.security.PrivateKey; import org.jose4j.base64url.Base64; import org.jose4j.json.JsonUtil; import org.jose4j.jwk.OctJwkGenerator; import org.jose4j.jwk.OctetSequenceJsonWebKey; import org.jose4j.jws.AlgorithmIdentifiers; import org.jose4j.jws.JsonWebSignature; import org.jose4j.jwt.JwtClaims; import org.jose4j.jwt.NumericDate; import org.jose4j.keys.HmacKey; import org.jose4j.lang.JoseException; import sun.lwawt.macosx.CSystemTray; public class Main { public static void main(String[] args) throws JoseException, UnsupportedEncodingException { // Use the example from this topic. String privateKeyJson = "{\n" + " \"k\": \"VoBG-oyqVoyCr9G56ozmq8n_rlDDyYMQOd_DO4GOkEY\",\n" + " \"kty\": \"oct\",\n" + " \"alg\": \"HS256\",\n" + "}"; JwtClaims claims = new JwtClaims(); claims.setGeneratedJwtId(); claims.setIssuedAtToNow(); // Set the expiration time to less than 7 days. NumericDate date = NumericDate.now(); date.addSeconds(120*60); claims.setExpirationTime(date); claims.setNotBeforeMinutesInThePast(1); // Add custom parameters. All values must be of the String type. // Set the consumer identifier. claims.setClaim("uid", "11215ac069234abcb8944232b79ae711"); JsonWebSignature jws = new JsonWebSignature(); // Set the encryption algorithm. jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.HMAC_SHA256); jws.setKey(new HmacKey(Base64.decode(JsonUtil.parseJson(privateKeyJson).get("k").toString()))); jws.setPayload(claims.toJson()); String jwtResult = jws.getCompactSerialization(); System.out.println("Generate Json Web token , result is \n " + jwtResult); } }Configuración del código:
privateKeyJson: El JWKS utilizado al crear el consumidor. Guarde el JWKS durante la creación del consumidor o recupérelo desde la página de configuración básica del consumidor.Establezca el identificador del consumidor. La instrucción es
claims.setClaim("uid", "11215ac069234abcb8944232b79ae711"). Este identificador se genera automáticamente al crear un consumidor, pero puede modificarse. También puede recuperarlo desde la página de configuración básica del consumidor.-
Establezca el algoritmo de cifrado. La instrucción es
jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.HMAC_SHA256). Este algoritmo debe coincidir con el especificado en el JWKS.NotaLos algoritmos de cifrado compatibles incluyen ES256, ES384, ES512, RS256, RS384, RS512, PS256, PS384, PS512, HS256, HS384, HS512 y EdDSA.
Para el cifrado simétrico, se debe decodificar el valor de "k".
jws.setKey(new HmacKey(Base64.decode(JsonUtil.parseJson(privateKeyJson).get("k").toString())));
-
Establezca el tiempo de expiración. El token debe caducar en un plazo de siete días. Una vez vencido, genere un nuevo token.
... NumericDate date = NumericDate.now(); date.addSeconds(120*60); claims.setExpirationTime(date); claims.setNotBeforeMinutesInThePast(1); ... Puede agregar parámetros personalizados al PAYLOAD del JWKS según sus necesidades.
Clave asimétrica
Código de ejemplo:
package org.example; import java.security.PrivateKey; import org.jose4j.json.JsonUtil; import org.jose4j.jws.AlgorithmIdentifiers; import org.jose4j.jws.JsonWebSignature; import org.jose4j.jwt.JwtClaims; import org.jose4j.jwt.NumericDate; import org.jose4j.lang.JoseException; import org.jose4j.jwk.RsaJsonWebKey; public class Main { public static void main(String[] args) throws JoseException { // Sample key in JWK format. String privateKeyJson = "{" + "\"kty\":\"RSA\"," + "\"n\":\"u-8lR9lyRhu8tl4vRxOl7yfshssx5jRstabc9n4Rxrz102Z7TPFYrXBZHgf67Y0d-zx9tWd5j91WZxLHv4K6VWPN7zEWEQNn3vUg76dPHPzVkZJWziFPS1EvS4a2gRZdrE4nPogaQ72WySVC0yUF2fL0NKeOclD__coCFxn4QQjcDXyu_CUbI_FuDcdw267mVjjylAaFvOZHH0pXsV8m5zXlpc2aiemWYQJD9MtWRcoKlexWMkTwbEqW5-NWAl0Uo202ahDA1NiaQ98Ch4nw6g2E1GvwxxHkbvMuZcs5z8F5Ct_w0IPtvY7ngSyEN-WCU40oj-C5NUCy_73FpXXdWQ\"," + "\"e\":\"AQAB\"," + "\"d\":\"Uxg1IqSZazg-Y2AXhVTBrJG5egwD3yZU3qiN0IsDbx0DkFoisG2R6PXg4W9j2n7nv7sKVhgPXrXdyys5mIrDuperaVQJzrHzzlgSHQSb7VQ5Vekfanq95a5avAkvTrpF5raTkYl6G3OLZRqNhnA7Oxe6NEHVsOPxnBQignZgFtiBtCSZY4RVH6Dx4jFfBBNMC9ifyLWLpHut7eczvxI412nBkxgtEjSeFe083NlumO_ZYHbijPcQf5zFWPLEj2EvlgbSwhjc-uSAF4OljAyG_DHZYvztEIGMdxMgBHgwtEvCfzS6PeUgvUR-SB7m_L8z4gjz6TlpSYe3CnZqE69KdQ\"," + "\"p\":\"9mNw8U_GxbcSknueUeFFSU9wKD9E9P2ZO5RP5d7o3qGUXOfbrH_g5GMH3YJiPBDZs_2BYFrAACOY4YM-QTiXWVs4xS3OeD8AdH3wEXR_3DMEkOez3cNq3Jy3ZJabm7IUnPMIWv5gpIHghcx0YTtM5RabSgexLMKh2-6sB466378\"," + "\"q\":\"w0PzXI_8Q5jv15OUq-dV_Z0kp91Icumf6PEERZN4v3i3VolLBnamMiIQiF74ywclKpZmtfOQTfyL41Xj2vbm2Aus6akRsU3NhQlVtIQTzHWUuEQgMIJYDK7--FzEcZORm1qBiEffiWv6U-slyCcLcNDNT-wjMX8BrS4oWHIoCOc\"," + "\"dp\":\"fRRiY76yE_EqVn63Eq4ftGXFdEkaQpzzS1GxderBoTO506hI1rtcedTkS0lDgWa0fjE1mqq3SdrIY8NyuT13Z_9tRHxKkrS5EGpWkyXnOuwTZ1SY9P2dpD1SxJfIizPOTxb5qOf2O81LI-F1O18VXD8rultJUIXGEZaKcpO8vpU\"," + "\"dq\":\"V6EP_vMzD5b707AMYVURFx7Fi3vX_pHvzJcVBrBW2P6wsGouvDjU_tygtMKCPoL3X_RdJbynfwgeMyihd-ujz0L2F2pjYUF8QP7ecoNvays9UbBpDbwBDbge_pCLLDlAeAqW5PT0UXSew7hcnUVAciGSchKT_Kt1siVrv72DT_M\"," + "\"qi\":\"w5fENzxOivbbbUbawAWSuLgWPtvbTKn2XuPzwr_JzZH08-nadWwQFChcvAiCs8V-306TQOh8NfY308QpGDIq-iRfrS7CEePOjRzpHJfsaQ1IFQqzgDZ9VGdJRDlZqRHx0DbqwMlleVKTC6ER6varalbr4lKU-ZPUQLCzj0e4PMs\"" + "}"; JwtClaims claims = new JwtClaims(); claims.setGeneratedJwtId(); // Automatically generate a JTI (JWT ID). claims.setIssuedAtToNow(); // Set the issued at time (iat) to the current time. // Set the expiration time to less than 7 days. NumericDate date = NumericDate.now(); date.addSeconds(120 * 60); // Set expiration to 120 minutes from now. claims.setExpirationTime(date); claims.setNotBeforeMinutesInThePast(1); // Set the not before (nbf) time to 1 minute in the past. // Add custom parameters. All values must be of the String type. // Set the consumer identifier. claims.setClaim("uid", "11215ac069234abcb8944232b79ae711"); JsonWebSignature jws = new JsonWebSignature(); // Set the encryption algorithm to RSA-SHA256. jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256); // Parse the private key and set it in the signer. PrivateKey privateKey = new RsaJsonWebKey(JsonUtil.parseJson(privateKeyJson)).getPrivateKey(); jws.setKey(privateKey); // Set the payload content. jws.setPayload(claims.toJson()); // Generate the JWT. String jwtResult = jws.getCompactSerialization(); System.out.println("Generate Json Web token , result is \n " + jwtResult); } }Configuración del código:
-
La configuración de
privateKeyJson, el identificador del consumidor y el tiempo de expiración son similares a los del cifrado simétrico.Establezca el algoritmo de cifrado mediante la instrucción
jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256). Este algoritmo debe coincidir con el especificado en el JWKS.Para un algoritmo de cifrado asimétrico, debe usar su clave privada para el cifrado.
... jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256); PrivateKey privateKey = new RsaJsonWebKey(JsonUtil.parseJson(privateKeyJson)).getPrivateKey(); jws.setKey(privateKey); ... Puede agregar parámetros personalizados al
PAYLOADdel JWT.
Envío de solicitudes de negocio
Cloud-native API Gateway admite pasar el token en un encabezado de solicitud. Puede personalizar el nombre del encabezado y el prefijo del token. La clave y el prefijo en la solicitud deben coincidir con los configurados en el método de autenticación del consumidor.
-
Las solicitudes sin JWT devuelven un error 401.
curl http://xxx.hello.com/test -
Las solicitudes con un JWT no válido devuelven un error 401.
curl http://xxx.hello.com/test -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMyJ9.eyJpc3MiOiJhYmNkIiwic3ViIjoidGVzdCIsImlhdCI6MTY2NTY2MDUyNywiZXhwIjoxODY1NjczODE5fQ.-vBSV0bKeDwQcuS6eeSZN9dLTUnSnZVk8eVCXdooCQ1' -
Si una solicitud incluye un JWT válido pero el consumidor no está autorizado para la API o ruta, se devuelve un error 403.
# consumer1 is not authorized for the route or API at the specified path. curl 'http://xxx.example.com/test' -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMyJ9.eyJpc3MiOiJhYmNkIiwic3ViIjoidGVzdCIsImlhdCI6MTY2NTY2MDUyNywiZXhwIjoxODY1NjczODE5fQ.-vBSV0bKeDwQcuS6eeSZN9dLTUnSnZVk8eVCXdooCQ4'
Validación de tokens en el servidor
La validación de tokens consta de tres pasos:
Compruebe si la solicitud incluye un token. En caso contrario, rechácela con 401.
Verifique la validez y expiración del token mediante la clave pública del JWKS del consumidor. Si no es válido o ha caducado, rechácelo con 401.
Compruebe si el consumidor está autorizado para acceder a la API o ruta solicitada.
Códigos de error comunes
|
Código de estado HTTP |
Mensaje de error |
Descripción |
|
401 |
Jwt missing |
Falta el JWT en el encabezado de la solicitud. |
|
401 |
Jwt expired |
El JWT ha caducado. |
|
401 |
Jwt verification fails |
Error en la verificación del payload del JWT; por ejemplo, debido a una discrepancia en |
|
403 |
Access Denied |
No hay permiso para acceder a la ruta actual. |
Autenticación AK/SK (HMAC)
Generación de firma en el cliente
El cliente genera una firma en tres pasos:
Extraer la cadena para firmar: Extraiga datos clave de la solicitud original para formar una cadena destinada a la firma.
Crear la firma: Cifre la cadena para firmar con la SK y así obtener la firma final.
Agregar la firma: Agregue todos los encabezados relacionados con la firma a la solicitud HTTP original para conformar la solicitud final.
Paso 1: Extraer la cadena para firmar
Extraiga datos clave de la solicitud HTTP y ensámblelos en una cadena para firmar con el siguiente formato:
HTTPMethod
Accept
Content-MD5
Content-Type
Date
Headers
PathAndParameters
Estos siete campos constituyen la cadena para firmar, separados por caracteres de nueva línea (\n). Si el campo Headers está vacío, no se requiere una nueva línea después de él. Para cualquier otro campo vacío, incluya su carácter de nueva línea. La firma distingue entre mayúsculas y minúsculas. Cada campo se extrae de la siguiente manera:
HTTPMethod: El método HTTP, en mayúsculas. Ejemplo:
POST.Accept: El valor del encabezado Accept. Puede estar vacío. Se recomienda establecer explícitamente el encabezado Accept. Si está vacío, algunos clientes HTTP establecen un valor predeterminado de
*/*, lo que provoca un fallo en la verificación de la firma.-
Content-MD5: El valor del encabezado
Content-MD5. Puede estar vacío. Calcúlelo solo para solicitudes con un cuerpo que no sea de formulario. El siguiente código Java muestra cómo calcular el valor deContent-MD5:String content-MD5 = Base64.encodeBase64(MD5(bodyStream.getbytes("UTF-8"))); Content-Type: El valor del encabezado
Content-Type. Puede estar vacío.Date: El valor del encabezado Date. Si
date_offsetno está habilitado, este campo puede estar vacío. De lo contrario, se utiliza para la verificación de desfase horario.-
Headers: Seleccione encabezados específicos para incluirlos en la firma. Concaténelos de la siguiente manera:
-
Ordene las claves de los encabezados alfabéticamente y concaténelas:
HeaderKey1 + ":" + HeaderValue1 + "\n"\+ HeaderKey2 + ":" + HeaderValue2 + "\n"\+ ... HeaderKeyN + ":" + HeaderValueN + "\n"
Si el valor de un encabezado está vacío, use
HeaderKey+":"+"\n"para la firma, conservando la clave y los dos puntos.Enumere las claves de todos los encabezados firmados en el encabezado
X-Ca-Signature-Headers, separadas por comas.Los siguientes encabezados no se incluyen en el cálculo de la firma:
X-Ca-Signature,X-Ca-Signature-Headers,Accept,Content-MD5,Content-TypeyDate.
-
-
PathAndParameters: Incluye la ruta, los parámetros de consulta y los parámetros de formulario. Se construye de la siguiente manera:
Path + "?" + Key1 + "=" + Value1 + "&" + Key2 + "=" + Value2 + ... "&" + KeyN + "=" + ValueNImportanteOrdene las claves de los parámetros de consulta y de formulario alfabéticamente antes de concatenarlas.
Si los parámetros de consulta y de formulario están vacíos, use la ruta directamente sin
?.Si el valor de un parámetro está vacío, incluya solo la clave. No se incluye el signo igual (
=).Si la consulta o el formulario contiene parámetros de matriz (misma clave, valores diferentes), use el primer valor para el cálculo de la firma.
Paso 2: Crear la firma
Cifre y codifique la cadena para firmar a fin de producir la firma final. En el siguiente ejemplo, stringToSign es la cadena extraída, secret es la SK de la configuración AK/SK, y sign es la firma generada:
Mac hmacSha256 = Mac.getInstance("HmacSHA256");
byte[] secretBytes = secret.getBytes("UTF-8");
hmacSha256.init(new SecretKeySpec(secretBytes, 0, secretBytes.length, "HmacSHA256"));
byte[] result = hmacSha256.doFinal(stringToSign.getBytes("UTF-8"));
String sign = Base64.encodeBase64String(result);
Decodifique stringToSign en una matriz de bytes UTF-8, cífrelo y codifique el resultado en Base64 para producir la firma.
Paso 3: Agregar la firma a la solicitud
Incluya los siguientes cuatro encabezados en la solicitud HTTP para la verificación de la firma:
x-ca-key: La AK de la configuración de autenticación AK/SK.x-ca-signature-method: El algoritmo de firma. Los valores válidos sonHmacSHA256oHmacSHA1. Esto es opcional y el valor predeterminado esHmacSHA256.x-ca-signature-headers: Una lista separada por comas de todas las claves de encabezado incluidas en la firma. Esto es opcional.x-ca-signature: La firma. Este campo es obligatorio.
Verificación de firma en el servidor
La verificación de firma en el servidor funciona de la siguiente manera:
Extraer la cadena para firmar: Extraiga datos clave de la solicitud recibida para formar una cadena destinada a la firma.
Recuperar la SK: Lea la AK de la solicitud y utilícela para recuperar la SK correspondiente.
Calcular la firma: Utilice el mismo algoritmo de cifrado y la SK recuperada para cifrar la cadena para firmar, lo que produce una firma del lado del servidor.
Verificar la firma: Lea la firma del cliente desde la solicitud y compárela con la firma del servidor para comprobar si coinciden.
Solución de problemas
Cuando falla la verificación de la firma, el servidor devuelve su cadena para firmar (StringToSign) en el encabezado de respuesta X-Ca-Error-Message. Compare el StringToSign del servidor con el que calculó localmente. Si coinciden, compruebe si utilizó la SK correcta. Dado que los encabezados HTTP no pueden contener caracteres de nueva línea, las nuevas líneas en el StringToSign se reemplazan con #:
X-Ca-Error-Message: Server StringToSign:`GET#application/json##application/json##X-Ca-Key:200000#X-Ca-Timestamp:1589458000000#/app/v1/config/keys?keys=TEST`
Códigos de error relacionados
|
Código de estado HTTP |
Mensaje de error |
Descripción |
|
401 |
Invalid Key |
Falta el encabezado |
|
401 |
Empty Signature |
Falta el encabezado |
|
400 |
Invalid Signature |
La firma en el encabezado |
|
400 |
Invalid Content-MD5 |
El encabezado |
|
400 |
Invalid Date |
El desfase horario calculado a partir del encabezado |
|
413 |
Request Body Too Large |
El tamaño del cuerpo de la solicitud supera el límite de 32 MB. |
|
413 |
Payload Too Large |
El cuerpo de la solicitud supera los |
|
403 |
Unauthorized Consumer |
El emisor de la solicitud no está autorizado. |
Código de ejemplo (Go)
go
package main
import (
"bytes"
"crypto/hmac"
"crypto/md5"
"crypto/sha256"
"encoding/base64"
"fmt"
"io"
"net/http"
"strings"
"time"
)
func generateHMACSignature(toSign string, key string) (string, error) {
h := hmac.New(sha256.New, []byte(key))
h.Write([]byte(toSign))
return base64.StdEncoding.EncodeToString(h.Sum(nil)), nil
}
func test(accessKey, secretKey string) {
body := `{"hello":"world"}`
h := md5.New()
h.Write([]byte(body))
payload := base64.StdEncoding.EncodeToString(h.Sum(nil))
headers := map[string]string{
"accept": "application/json",
"content-type": "application/json",
"date": time.Now().Format("2006-01-02 15:04:05"),
"x-ca-key": accessKey,
"foo": "bar",
"x-ca-signature-headers": "foo",
"content-md5": payload,
}
sts := strings.Join([]string{"POST", headers["accept"], headers["content-md5"], headers["content-type"], headers["date"], "foo:bar", "/post"}, "\n")
fmt.Printf("String to sign is: %s\n", strings.ReplaceAll(sts, "\n", "#"))
sign, _ := generateHMACSignature(sts, secretKey)
fmt.Printf("Signed string is: %s\n", sign)
headers["x-ca-signature"] = sign
req, _ := http.NewRequest("POST", "http://localhost:8080/post", bytes.NewBufferString(body))
for k, v := range headers {
req.Header.Add(k, v)
}
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Println("read body error")
}
defer resp.Body.Close()
fmt.Println("Headers are as follows:")
for k, v := range resp.Header {
// If signature verification fails, the X-Ca-Error-Message response header
// contains the server-side string to sign, which can be used for troubleshooting.
fmt.Printf(" %s: %s\n", k, v)
}
respBody, _ := io.ReadAll(resp.Body)
fmt.Println(string(respBody))
}
func main() {
test("appKey", "appSecret")
}
Autenticación por clave de API
La puerta de enlace autentica las solicitudes según el origen de credenciales configurado. El proceso es similar para API y rutas. Los siguientes ejemplos utilizan rutas.
Hay tres tipos de orígenes de credenciales disponibles para las claves de API:
Origen de credenciales predeterminado:
Authorization: Bearer <token>.Encabezado personalizado: Proporcione un nombre de encabezado.
Parámetro de consulta personalizado: Proporcione un nombre de parámetro de consulta.
Origen de credenciales predeterminado
Suponga que una solicitud coincide con la ruta abc. La clave de API se proporciona en el encabezado Authorization con el prefijo Bearer (observe el espacio final).
curl http://xxx.test.com/test -H 'Authorization: Bearer 2bda943c-ba2b-11ec-ba07-00163e1250b5'
Establecer la clave de API en el encabezado de la solicitud
curl http://xxx.test.com/test -H 'x-api-key: 2bda943c-ba2b-11ec-ba07-00163e1250b5'
Origen de encabezado personalizado
Suponga que la solicitud coincide con la ruta abc y la clave de API se encuentra en un encabezado personalizado.
-
Si la clave de API está en la ubicación incorrecta (por ejemplo, como parámetro de consulta en lugar del encabezado personalizado configurado), la solicitud se deniega con 401.
curl http://xxx.test.com/test?apikey=2bda943c-ba2b-11ec-ba07-00163e1250b5 -
Si la directiva está habilitada pero el consumidor no está autorizado, la solicitud se deniega con 403.
curl http://xxx.test.com/test -H 'x-api-key: 2bda943c-ba2b-11ec-ba07-00163e1250b5'
Parámetro de consulta personalizado
Suponga que la solicitud coincide con la ruta abc y la clave de API se encuentra en un parámetro de URL.
-
Si la autenticación de consumidores no está habilitada para la ruta, la solicitud se deniega con 401.
curl http://xxx.test.com/test?apikey=2bda943c-ba2b-11ec-ba07-00163e1250b5 -
Si la directiva está habilitada pero el consumidor no está autorizado, la solicitud se deniega con 403.
curl http://xxx.test.com/test?apikey=2bda943c-ba2b-11ec-ba07-00163e1250b5
Códigos de error relacionados
|
Código de estado HTTP |
Mensaje de error |
Descripción |
|
401 |
Request denied by Key Auth check. Multi API key found in request. |
Se proporcionaron varias claves de API en la solicitud. |
|
401 |
Request denied by Key Auth check. No API key found in request. |
No se proporcionó ninguna clave de API en la solicitud. |
|
401 |
Request denied by Key Auth check. Invalid API key. |
La clave de API proporcionada no tiene permitido el acceso. |
|
403 |
Request denied by Key Auth check. Unauthorized consumer. |
El emisor de la solicitud no está autorizado. |
Referencias
Puede autorizar y gestionar sus API a través de Authorization management.