Keycloak缺少表单参数:grant_type

Bor*_*lov 15 java authentication login keycloak

我在本地计算机上运行了独立的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"
}
Run Code Online (Sandbox Code Playgroud)

应该给我jwt令牌,但是我收到了错误的请求并做出了回应

{
    "error": "invalid_request",
    "error_description": "Missing form parameter: grant_type"
}
Run Code Online (Sandbox Code Playgroud)

我假设我的配置中缺少某些内容。

编辑:我正在使用json正文,但它应该是形式url编码:以下正文有效:

token_type_hint:access_token&token:{token}&client_id:{client_id}&client_secret:{client_secret}
Run Code Online (Sandbox Code Playgroud)

ipa*_*ave 22

您应该在POST请求中发送数据,并将Content-Type标头值设置为application/x-www-form-urlencoded,而不是json。

  • 即使我将内容类型设置为 urlencoded,我仍然遇到同样的问题:curl -d '{"grant_type": "password", "username": "user", "password": "pass", " client_id": "登录应用程序"}' -H "内容类型:application/x-www-form-urlencoded" -X POST "http://localhost:8082/auth/realms/ina-dev/protocol/openid -connect/token" {"error":"invalid_request","error_description":"缺少表单参数:grant_type"} (7认同)
  • 这是行不通的。你如何在邮递员中设置“-d”内容,@ipave? (3认同)
  • 因为您发送 json 数据,所以应该使用 -d "param1=value1¶m2=value2" 语法 (2认同)
  • @Avión这是链接-https://learning.getpostman.com/docs/postman/sending_api_requests/requests/#urlencoded (2认同)

小智 14

带卷曲

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'
Run Code Online (Sandbox Code Playgroud)

邮递员(为参数选择 x-www-form-urlencoded 选项)

在此处输入图片说明

  • 不要忘记输入`client_secret` (2认同)

Mar*_*ton 10

对于那些从搜索中找到JavaScript解决方案的人。

交换时下面是一个例子codeaccess_tokenkeycloak权限使用axios

本示例中使用了查询字符串

npm install querystring
Run Code Online (Sandbox Code Playgroud)

或者

yarn add querystring
Run Code Online (Sandbox Code Playgroud)

发送请求:


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

});

Run Code Online (Sandbox Code Playgroud)

您需要在请求正文中以 URL 编码字符串的形式发送带有参数的 POST 请求。

FormData 对象不起作用。


Adn*_*han 6

对于卷曲有问题的人,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"
Run Code Online (Sandbox Code Playgroud)

curl命令在没有Content-Type标题的情况下有效。