web-dev-qa-db-de.com

Keycloak Fehlender Formularparameter: grant_type

Auf meinem lokalen Computer ist Keycloak Standalone ausgeführt.

Ich habe einen neuen Bereich mit dem Namen 'Spring-Test' erstellt, dann den neuen Client mit dem Namen 'Login-App'.

Laut den übrigen Unterlagen:

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.

EDIT: Ich habe json body verwendet, aber es sollte von der form-URL codiert werden: Der folgende body funktioniert:

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

Sie sollten Ihre Daten in einer Anforderung POST senden, wobei der Content-Type-Header-Wert auf application/x-www-form-urlencoded und nicht auf json gesetzt ist.

2
ipave

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

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

Hier ist ein vollständiges Beispiel für den Austausch von code gegen access_token mit der Berechtigung keycloak unter Verwendung von axios.

Ich habe in diesem Beispiel querystring verwendet:

npm install querystring --save-dev

oder

yarn add querystring --dev

Senden der Anfrage:


import queryString from 'querystring'

const params = {

    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: queryString.stringify(params),
    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 Anfrage mit den Parametern als URL-codierte Zeichenfolge im Anfragetext senden.

FormData-Objekt funktioniert nicht.

0
Marc Newton