Keycloak Fehlender Formularparameter: grant_type

Lesezeit: 4 Minuten

Benutzer-Avatar
Borislaw Stoilow

Ich habe Keycloak Standalone auf meinem lokalen Rechner ausgeführt.

Ich habe einen neuen Bereich namens „Spring-Test“ erstellt, dann einen neuen Client namens „Login-App“.

Laut Restdokumentation:

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

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

sollte mir das JWT-Token geben, aber ich bekomme eine schlechte Anfrage mit Antwort

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

Ich gehe davon aus, dass in meiner Konfiguration etwas fehlt.

BEARBEITEN: Ich habe json body verwendet, aber es sollte sein application/x-www-form-urlencoded: der folgende Körper funktioniert:

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

Benutzer-Avatar
ipave

Sie sollten Ihre Daten in einem POST-Request mit senden Content-Type Header-Wert gesetzt auf application/x-www-form-urlencodednicht json.

  • Ich habe immer noch das gleiche Problem, auch wenn ich den Inhaltstyp auf urlencoded eingestellt habe: curl -d ‘{“grant_type”: “password”, “username”: “user”, “password”: “pass”, ” client_id”: “login-app”}’ -H “Content-Type: application/x-www-form-urlencoded” -X POST “localhost:8082/auth/realms/ina-dev/protocol/openid-connect/…” {“error”:”invalid_request”,”error_description”:”Formularparameter fehlt: grant_type”}

    – Ognjen Mišić

    7. Februar 2019 um 10:18 Uhr


  • Da Sie json-Daten senden, sollten Sie die Syntax -d “param1=value1&param2=value2” verwenden

    – ipave

    8. Februar 2019 um 16:31 Uhr

  • Das funktioniert nicht. Wie stellt man das ein -d Zeug im Postboten, @ipave?

    – Avion

    24. April 2019 um 14:25 Uhr

  • @Avión hier ist ein Link – learning.getpostman.com/docs/postman/sending_api_requests/…

    – ipave

    25. April 2019 um 13:42 Uhr


  • Danke, ich habe “multipart/form-data; border=———————616846104444017186133807” gesendet.

    – masterxilo

    6. Juni 2019 um 13:42 Uhr

Mit Locke

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'

Per Postbote (Wählen Sie die Option x-www-form-urlencoded für Parameter)

Geben Sie hier die Bildbeschreibung ein

  • vergessen Sie nicht zu setzen client_secret

    – aswzen

    7. Juli 2020 um 17:14 Uhr


Benutzer-Avatar
Marc

Für diejenigen, die hier von einer Suche gelandet sind JavaScript Lösung.

Hier ist ein Beispiel beim Austausch code zum access_token mit keycloak Autorität verwenden axios.

Senden der Anfrage:


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);

});

Sie müssen eine POST-Anforderung mit den Parametern als URL-codierte Zeichenfolge im Anforderungstext senden.

FormData-Objekt funktioniert nicht.

  • Es gibt eine einfache Möglichkeit, Token zu erhalten, ohne eine Abfragezeichenfolge zu verwenden. 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, Formularparameter, Konfiguration);

    – Syam Sankar

    15. Januar 2021 um 9:45 Uhr


  • Pavan J hat eine Antwort gepostet, in der es heißt: „Danke @marc für die Lösung und sie funktioniert! Ich habe in einer ganzen Reihe von Foren nach dieser Lösung gesucht.

    – Scratte

    19. April 2021 um 17:16 Uhr

  • querystring ist jetzt veraltet github.com/nodejs/node/blob/v17.0.0/lib/querystring.js

    – Sudarschan

    16. März um 14:46 Uhr

  • Da querystring veraltet ist, wie @sudarshan betonte, können wir stattdessen URLSearchParams verwenden. In diesem Code-Snippet können wir ersetzen new URLSearchParams(params) zum queryString.stringify(params). URLSearchParams sollten in neueren Versionen von node und dem Browser unterstützt werden. Wenn Ihre Node-Version dies nicht unterstützt, können wir eine Polyfüllung verwenden

    – Jonathan Beadle

    7. April um 17:16 Uhr


Benutzer-Avatar
Adnan Khan

Für diejenigen, die Probleme mit Curl haben, lautet der Curl-Befehl wie folgt

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"

Der Curl-Befehl funktioniert ohne die Content-Type Header.

Hier ist ein Beispiel für einen CURL-Befehl

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'

Ich hatte ein ähnliches Problem beim SOAPUI-Testen. Wir sollten keinen json POST. Dies wurde behoben, als ich „Medientyp“ deaktiviert und das Kontrollkästchen „PostQueryString“ aktiviert hatte. Das Feld „Medientyp“ wird von selbst auf „www-form-urlencoded“ gesetzt. Fügen Sie oben Attribute hinzu, indem Sie auf das Pluszeichen klicken.

Geben Sie hier die Bildbeschreibung ein

1381670cookie-checkKeycloak Fehlender Formularparameter: grant_type

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy