java Keycloak缺少表单参数:授权类型

0mkxixxg  于 2023-01-19  发布在  Java
关注(0)|答案(7)|浏览(162)

我在本地机器上运行了keycloak standalone。
我创建了名为“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 body,但它应该是application/x-www-form-urlencoded:下列机构工作:

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

64jmpszr1#

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

sshcrbum

sshcrbum2#

带 curl

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'

Postman (选择参数的x-www-form-urlencoded选项)

guz6ccqo

guz6ccqo3#

对于那些谁降落在这里从搜索寻找JavaScript解决方案。
下面是使用axioscode交换为具有keycloak权限的access_token的示例。
发送请求:

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

});

您需要发送一个POST请求,其中的参数作为请求正文中的URL编码字符串。
FormData对象不起作用。

5vf7fwbs

5vf7fwbs4#

对于那些使用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"

curl命令在没有Content-Type标头的情况下也可以工作。

t8e9dugd

t8e9dugd5#

以下是CURL命令示例

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'
u1ehiz5o

u1ehiz5o6#

我在SOAPUI测试中遇到过类似的问题。我们不应该发布一个json。当我清除“媒体类型”并选中“PostQueryString”复选框时,这个问题得到了解决。“媒体类型框”将自己设置为“www-form-urlencoded”。通过点击加号在顶部添加属性。

fd3cxomn

fd3cxomn7#

错误类型:{“错误”:“无效请求”,“错误描述”:“缺少表单参数:授权类型”}
大家好,如果您在发出POST请求以测试keycloak时遇到ARC“grant_type”错误,您可以在参数中进行以下修改:将标题设置为“内容类型”,并将值设置为“应用程序/x-www-form-urlencoded”

相关问题