我在本地计算机上通过 docker 部署了 Keycloak
22.0.5
。我有一个自定义 OpenID 客户端,其访问权限配置如下:
我不想使用密码授予,我正在使用 pkce
(authorization_code
变体)授予(与 account-console
的方式相同)。
这是我发送到服务器进行身份验证的请求:
GET localhost:2137/realms/SpringKeycloak/protocol/openid-connect/auth?
client_id=login-user
&redirect_uri=http%3A%2F%2Flocalhost%3A8000
&state=af08ea5a-9d4d-4850-9491-483809f2c991
&response_type=code
&scope=openid
&code_challenge=Jqd4T8zNX438YOgW-99eFp_7fbMkDb1Tyu0TtU41x3A
&code_challenge_method=S256
&grant_type=pkce
现在,问题是这工作得很好,但是当我尝试获取令牌时,使用相同的
redirect_uri
:
POST localhost:2137/realms/SpringKeycloak/protocol/openid-connect/token
code=ed24eb7c-ef7e-4c51-b545-c59e0717f6a1.54c25efe-7721-4d81-9f64-99493ee365b9.a2b82e1f-84c7-464f-a555-dcea26162e5a
&grant_type=authorization_code
&client_id=login-user
&redirect_uri=http%3A%2F%2Flocalhost%3A8000
&code_verifier=0a844a24ec41aeb96bc016d8d488794802a066378bbfd35bb8adcf55
但是它声称该网址现在无效:
{
"error": "invalid_grant",
"error_description": "invalid parameter: redirect_uri"
}
我不知道是什么导致了这种行为。我已经通过配置和互联网进行了查看,但我找不到任何可能导致此问题的其他设置。
我还尝试将第二个请求中的授权类型更改为与第一个请求相同的
pkce
,但它只是引发了unsupported_grant_type
将
code
兑换为令牌时,您必须通过 HTTP POST (x-www-form-urlencoded) 提交所有参数。在这种情况下,redirect_uri
不得进行 urlencode,因为执行 HTTP POST 的工具很可能会为您进行 URL 编码。
此外,如果您使用例如邮递员,看来您通过“Params”而不是通过“Body -> x-www-form-urlencoded”发送HTTP POST中的参数。