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}
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.
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"
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.