Keycloak Falta el parámetro de formulario: grant_type

5 minutos de lectura

Avatar de usuario de Borislav Stoilov
Borislav Stoilov

Tengo keycloak independiente ejecutándose en mi máquina local.

Creé un nuevo reino llamado ‘prueba de primavera’, luego un nuevo cliente llamado ‘aplicación de inicio de sesión’

Según el resto de la documentación:

POST: http://localhost:8080/auth/realms/spring-test/protocol/openid-connect/token

{
    "client_id": "login-app",
    "username": "user123",
    "password": "pass123",
    "grant_type": "password"
}

debería darme el token jwt pero recibo una solicitud incorrecta con respuesta

{
    "error": "invalid_request",
    "error_description": "Missing form parameter: grant_type"
}

Supongo que falta algo en mi configuración.

EDITAR: estaba usando json body pero debería ser application/x-www-form-urlencoded: funciona el siguiente cuerpo:

token_type_hint:access_token&token:{token}&client_id:{client_id}&client_secret:{client_secret}

avatar de usuario de ipave
pavimentar

Debe enviar sus datos en una solicitud POST con Content-Type valor de encabezado establecido en application/x-www-form-urlencodedno json.

  • Todavía tengo el mismo problema, incluso si configuro el tipo de contenido para que esté codificado en URL: curl -d ‘{“grant_type”: “contraseña”, “nombre de usuario”: “usuario”, “contraseña”: “contraseña”, ” client_id”: “aplicación de inicio de sesión”}’ -H “Tipo de contenido: aplicación/x-www-form-urlencoded” -X POST “localhost:8082/auth/realms/ina-dev/protocol/openid-connect/…” {“error”:”invalid_request”,”error_description”:”Falta el parámetro de formulario: grant_type”}

    – Ognjen Misic

    7 de febrero de 2019 a las 10:18


  • debido a que envía datos json, debe usar la sintaxis -d “param1 = value1 & param2 = value2”

    – ipave

    8 de febrero de 2019 a las 16:31

  • Esto no está funcionando. ¿Cómo configuras eso? -d cosas en cartero, @ipave?

    – Avión

    24 de abril de 2019 a las 14:25

  • @Avión aquí hay un enlace: aprendizaje.getpostman.com/docs/postman/sending_api_requests/…

    – ipave

    25 de abril de 2019 a las 13:42


  • Gracias, estaba enviando “multipart/form-data; border=————————–616846104444017186133807”

    – maestroxilo

    6 de junio de 2019 a las 13:42

con rizo

curl -X POST \
http://localhost:8080/auth/realms/api-gateway/protocol/openid-connect/token \
-H 'Accept: */*' \
-H 'Accept-Encoding: gzip, deflate' \
-H 'Cache-Control: no-cache' \
-H 'Connection: keep-alive' \
-H 'Content-Length: 73' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'Cookie: JSESSIONID=F8CD240FF046572F864DC37148E51128.a139df207ece;   JSESSIONID=65D31B82F8C5FCAA5B1577DA03B4647C' \
-H 'Host: localhost:8080' \
-H 'Postman-Token: debc4f90-f555-4769-b392-c1130726a027,d5087d9f-9253-48bd-bb71-fda1d4558e4d' \
-H 'User-Agent: PostmanRuntime/7.15.2' \
-H 'cache-control: no-cache' \
-d 'grant_type=password&client_id=api-gateway&username=admin&password=temp123'

Por cartero (seleccione la opción x-www-form-urlencoded para los parámetros)

ingrese la descripción de la imagen aquí

  • no olvides poner client_secret

    – Aswzen

    7 de julio de 2020 a las 17:14


Avatar de usuario de Marc
Bagazo

Para aquellos que aterrizaron aquí de una búsqueda en busca de JavaScript solución.

Aquí hay un ejemplo al intercambiar code por access_token con keycloak autoridad usando axios.

Enviando la solicitud:


const params = new URLSearchParams({

    grant_type: 'authorization_code',
    client_id: 'client-id-here',
    code: 'code-from-previous-redirect',
    redirect_uri: location.protocol + '//' + location.host

});

axios({

    method: 'post',
    url: 'https://my-keycloak.authority/token',
    data: params.toString(),
    config: {
        headers: {'Content-Type': 'application/x-www-form-urlencoded'}
    }

}).then(response => {

    console.log(response.data);

}).catch(error => {

    console.error(error);

});

Debe enviar una solicitud POST con los parámetros como una cadena codificada de URL en el cuerpo de la solicitud.

El objeto FormData no funciona.

  • Hay una manera fácil de obtener un token sin usar una cadena de consulta. const config = { headers: {‘Content-Type’: ‘application/x-www-form-urlencoded’} }; const formParameter = client_id=KEYCLOAK_CLIENT_ID&client_secret=KEYCLOAK_CLIENT_SECRET&grant_type=KEYCLOAK_API_GRANT_TYPE; axios.post(REQUEST_URL,formParameter,config);

    –Syam Sankar

    15 de enero de 2021 a las 9:45


  • Pavan J publicó una respuesta que decía: “¡Gracias @marc por la solución y funciona! He estado buscando esta solución en varios foros. PD: Hay un error tipográfico en grant_type: ‘authorization_code’, (falta la cita de cierre)”.

    – Scratte

    19 de abril de 2021 a las 17:16

  • querystring está en desuso ahora github.com/nodejs/node/blob/v17.0.0/lib/querystring.js

    – Sudarshan

    16 de marzo a las 14:46

  • Dado que la cadena de consulta está obsoleta como señaló @sudarshan, podemos usar URLSearchParams en su lugar. En este fragmento de código podemos sustituir new URLSearchParams(params) por queryString.stringify(params). URLSearchParams debe admitirse en las versiones más recientes del nodo y del navegador. Si su versión de nodo no es compatible, podemos usar un polyfill

    –Jonathan Beadle

    7 abr a las 17:16


Avatar de usuario de Adnan Khan
adnan khan

Para aquellos que tienen problemas con curl, el comando curl es el siguiente

curl -d "client_secret=<client-secret>" -d "client_id=<client-id>" -d "username=<username>" -d "password=<password>" -d "grant_type=password" "http://localhost:8080/auth/realms/<realm-name>/protocol/openid-connect/token"

El comando curl funciona sin el Content-Type encabezamiento.

Aquí hay un comando CURL de muestra

curl -X POST \
  http://localhost:8080/auth/realms/your_realm_name/protocol/openid-connect/token \
  -H 'Accept: */*' \
  -H 'Accept-Encoding: gzip, deflate' \
  -H 'Cache-Control: no-cache' \
  -H 'Connection: keep-alive' \
  -H 'Content-Length: 69' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'Cookie: KC_RESTART=' \
  -H 'Host: localhost:8080' \
  -H 'Postman-Token: 88f38aa0-8659-4b37-a2aa-d6b92177bdc2,29c4e7db-51f4-48d1-b6d5-daab06b68ab4' \
  -H 'User-Agent: PostmanRuntime/7.20.1' \
  -H 'cache-control: no-cache' \
  -d 'client_id=my-app&username=admin&password=admin123&grant_type=password'

Tuve un problema similar en las pruebas de SOAPUI. No debemos PUBLICAR un json. Esto se resolvió cuando borré ‘Tipo de medio’ y marqué la casilla de verificación ‘PostQueryString’. El ‘cuadro de tipo de medio’ se establecerá en ‘www-form-urlencoded’ por sí mismo. Agregue atributos en la parte superior presionando el signo más.

ingrese la descripción de la imagen aquí

¿Ha sido útil esta solución?