2017-10-11 99 views
2

從(移動)應用程序調用Keycloak的註銷端點時遇到問題。通過Keycloak REST API註銷用戶不起作用

its documentation指出此方案被支撐:

/境界/ {領域名} /協議/ OpenID的連接/註銷

的註銷端點註銷已認證用戶。

用戶代理可以被重定向到端點,在這種情況下,活動用戶會話被註銷。之後,用戶代理被重定向迴應用程序。

端點也可以由應用程序直接調用。要直接調用此端點,需要包含刷新令牌以及驗證客戶端所需的憑據。

我的要求有以下格式:

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" 
} 

似乎Keycloak是無法檢測到當前客戶端的身份事件,如果我提供access_token。我所使用的相同的access_token訪問其他Keycloak的API,沒有任何問題,像用戶信息/auth /中境界//協議/ OpenID的連接/用戶信息)。

我的請求是基於這個Keycloak's issue。問題的作者得到了它的工作,但它不是我的情況。

我正在使用Keycloak 3.2.1.Final

你有同樣的問題嗎?你有什麼想法如何解決它?

回答

3

最後,我找到了Keycloak的源代碼:https://github.com/keycloak/keycloak/blob/9cbc335b68718443704854b1e758f8335b06c242/services/src/main/java/org/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> 

會話應該被正確銷燬。