ローカルマシンでkeycloakスタンドアロンを実行しています。
「spring-test」という新しいレルムを作成してから、「login-app」という新しいクライアントを作成しました
残りのドキュメントによると:
POST: http://localhost:8080/auth/realms/spring-test/protocol/openid-connect/token
{
"client_id": "login-app",
"username": "user123",
"password": "pass123",
"grant_type": "password"
}
jwtトークンを提供する必要がありますが、応答で悪いリクエストを受け取ります
{
"error": "invalid_request",
"error_description": "Missing form parameter: grant_type"
}
私の構成に何かが欠けていると思います。
編集:私はJSONボディを使用していましたが、URLエンコードされたフォームでなければなりません:次のボディは動作します:
token_type_hint:access_token&token:{token}&client_id:{client_id}&client_secret:{client_secret}
JsonではなくContent-Type
ヘッダー値をapplication/x-www-form-urlencoded
に設定したPOSTリクエストでデータを送信する必要があります。
Curlに問題がある場合、curlコマンドは次のとおりです。
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"
以下は、code
を使用してkeycloak
をaccess_token
とaxios
権限で交換する場合の完全な例です。
この例では querystring を使用しました。
npm install querystring --save-dev
または
yarn add querystring --dev
リクエストの送信:
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);
});
POSTリクエストのリクエストボディにURLエンコード文字列としてパラメータを指定したリクエストを送信する必要があります。
FormDataオブジェクトは機能しません。