从(移动)应用程序调用Keycloak的注销端点时出现问题。
支持此方案,如其文档中所述:
/ realms / {realm-name} / protocol / openid-connect / logout
注销端点注销已认证的用户。
可以将用户代理重定向到端点,在这种情况下,活动用户会话将被注销。之后,将用户代理重定向回应用程序。
端点也可以由应用程序直接调用。要直接调用此端点,需要包括刷新令牌以及认证客户端所需的凭据。
我的请求具有以下格式:
POST http://localhost:8080/auth/realms/<my_realm>/protocol/openid-connect/logout
Authorization: Bearer <access_token>
Content-Type: application/x-www-form-urlencoded
refresh_token=<refresh_token>
但是总是会发生此错误:
HTTP/1.1 400 Bad Request
Connection: keep-alive
X-Powered-By: Undertow/1
Server: WildFly/10
Content-Type: application/json
Content-Length: 123
Date: Wed, 11 Oct 2017 12:47:08 GMT
{
"error": "unauthorized_client",
"error_description": "UNKNOWN_CLIENT: Client was not identified by any client authenticator"
}
如果我提供了access_token,似乎Keycloak无法检测到当前客户端的身份事件。我使用相同的access_token可以毫无问题地访问其他Keycloak的API,例如userinfo(/ auth / realms // protocol / openid-connect / userinfo)。
我的请求基于此Keycloak的问题。问题的作者认为它起作用了,但这不是我的情况。
我正在使用Keycloak 3.2.1.Final。
你有同样的问题吗?你有解决的办法吗?
最后,我通过查看Keycloak的源代码找到了解决方案:https : //github.com/keycloak/keycloak/blob/9cbc335b68718443704854b1e758f8335b06c242/services/src/main/java/org/key/ak/keycloak/protocol/oidc/endpoints/ LogoutEndpoint.java#L169。它说:
如果客户端是公共客户端,则必须包括“ client_id”表单参数。
所以我所缺少的是client_id表单参数。我的要求应该是:
POST http://localhost:8080/auth/realms/<my_realm>/protocol/openid-connect/logout
Authorization: Bearer <access_token>
Content-Type: application/x-www-form-urlencoded
client_id=<my_client_id>&refresh_token=<refresh_token>
该会话应正确销毁。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句