Avalados por :

Obteniendo un Token de SAPI CPI: Solución al Error 401 - Credenciales Incorrectas

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 9 Vistas
0
Cargando...

Estoy intentando obtener un token de SAPI CPI, pero recibo un error 401 - Credenciales incorrectas. Aquí está mi código: -

$client_id="***";
$client_secret="***";
              
// Definir la solicitud POST para recuperar el token
$post_data = array(
    "grant_type" => "client_credentials",
    "client_id" => $client_id,
    "client_secret" => $client_secret
);              

$url='https://***.authentication.us10.hana.ondemand.com/oauth/token';

//abrir conexión
$ch = curl_init();

$content_type = array('Content-Type: application/x-www-form-urlencoded');

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data));
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, $content_type); 

//ejecutar post
$result = curl_exec($ch);

He logrado que esto funcione usando POSTMAN con el mismo Cliente Id y secreto. Cualquier ayuda es muy apreciada.

Gracias

Martín

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Cargando...

Hola Martin,

vamos a revisar el código e identificar posibles problemas:

1. Tipo de contenido:
En el código, estás estableciendo el encabezado 'Content-Type' a 'application/x-www-form-urlencoded', pero estás enviando los datos en formato json usando 'json_encode($post_data)'.
Para el tipo de concesión de credenciales del cliente, los datos deben enviarse en forma de parámetros codificados en URL, no en JSON.

2. Eliminación de la verificación SSL:
Has deshabilitado la verificación SSL con 'CURLOPT_SSL_VERIFYHOST' y 'CURLOPT_SSL_VERIFYPEER' configurados en '0'. Si bien esto puede funcionar para pruebas, no se recomienda para producción, ya que representa riesgos de seguridad. Asegúrate de tener certificados SSL válidos y usar una verificación SSL adecuada en producción.

tu código reescrito:

$client_id = "***";
$client_secret = "***";

// Definir la solicitud POST para recuperar el token
$post_data = array(
    "grant_type" => "client_credentials",
    "client_id" => $client_id,
    "client_secret" => $client_secret
);

// Convertir los datos a formato codificado en URL
$post_data = http_build_query($post_data);

$url = 'https://***.authentication.us10.hana.ondemand.com/oauth/token';

// Abrir conexión
$ch = curl_init();

$content_type = 'Content-Type: application/x-www-form-urlencoded';

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
// Habilitar verificación SSL en producción
// curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
// curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array($content_type));

// Ejecutar post
$result = curl_exec($ch);

// Verificar errores de curl
if (curl_errno($ch)) {
    echo 'Error de Curl: ' . curl_error($ch);
}

// Cerrar conexión
curl_close($ch);

// Procesar el resultado
if ($result !== false) {
    // Éxito en la recuperación del token, procesar el token (generalmente en formato JSON)
    $token_data = json_decode($result, true)
        
Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Martin,

Cambiar esa línea sola no ayudaría. Por favor, echa otro vistazo al código y nota lo que he cambiado arriba para formatear los datos.

Saludos,
Jwan

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

También noté que tener mi client_id y client_secret envueltos en comillas dobles en lugar de simples no era bueno.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Utilicé Postman para invocar la API Get Token, lo cual funcionó. Pude ver lo que Postman estaba haciendo en PHP CURL y utilicé eso.

Ahora está funcionando.

La única diferencia fue con el valor de POSTFIELDS. Debe estar en el formato: -

CURLOPT_POSTFIELDS => 'grant_type=client_credentials&client_id=**&client_secret=**'

Gracias

Martin

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?