keycloak-service
公開メンバ関数 | 非公開メンバ関数 | 非公開変数類 | 静的非公開変数類 | 全メンバ一覧
org.keycloak.protocol.oidc.endpoints.LogoutEndpoint クラス
org.keycloak.protocol.oidc.endpoints.LogoutEndpoint 連携図
Collaboration graph

公開メンバ関数

 LogoutEndpoint (TokenManager tokenManager, RealmModel realm, EventBuilder event)
 
Response logout (@QueryParam(OIDCLoginProtocol.REDIRECT_URI_PARAM) String redirectUri, @QueryParam("id_token_hint") String encodedIdToken, @QueryParam("post_logout_redirect_uri") String postLogoutRedirectUri, @QueryParam("state") String state)
 
Response logoutToken ()
 

非公開メンバ関数

void logout (UserSessionModel userSession, boolean offline)
 
ClientModel authorizeClient ()
 
void checkSsl ()
 

非公開変数類

KeycloakSession session
 
ClientConnection clientConnection
 
HttpRequest request
 
HttpHeaders headers
 
TokenManager tokenManager
 
RealmModel realm
 
EventBuilder event
 

静的非公開変数類

static final Logger logger = Logger.getLogger(LogoutEndpoint.class)
 

詳解

著者
Stian Thorgersen

構築子と解体子

◆ LogoutEndpoint()

org.keycloak.protocol.oidc.endpoints.LogoutEndpoint.LogoutEndpoint ( TokenManager  tokenManager,
RealmModel  realm,
EventBuilder  event 
)
inline
82  {
84  this.realm = realm;
85  this.event = event;
86  }
TokenManager tokenManager
Definition: LogoutEndpoint.java:78
EventBuilder event
Definition: LogoutEndpoint.java:80
RealmModel realm
Definition: LogoutEndpoint.java:79

関数詳解

◆ authorizeClient()

ClientModel org.keycloak.protocol.oidc.endpoints.LogoutEndpoint.authorizeClient ( )
inlineprivate
217  {
218  ClientModel client = AuthorizeClientUtil.authorizeClient(session, event).getClient();
219 
220  if (client.isBearerOnly()) {
221  throw new ErrorResponseException("invalid_client", "Bearer-only not allowed", Response.Status.BAD_REQUEST);
222  }
223 
224  return client;
225  }
KeycloakSession session
Definition: LogoutEndpoint.java:67
EventBuilder event
Definition: LogoutEndpoint.java:80

◆ checkSsl()

void org.keycloak.protocol.oidc.endpoints.LogoutEndpoint.checkSsl ( )
inlineprivate
227  {
228  if (!session.getContext().getUri().getBaseUri().getScheme().equals("https") && realm.getSslRequired().isRequired(clientConnection)) {
229  throw new ErrorResponseException("invalid_request", "HTTPS required", Response.Status.FORBIDDEN);
230  }
231  }
ClientConnection clientConnection
Definition: LogoutEndpoint.java:70
KeycloakSession session
Definition: LogoutEndpoint.java:67
RealmModel realm
Definition: LogoutEndpoint.java:79

◆ logout() [1/2]

Response org.keycloak.protocol.oidc.endpoints.LogoutEndpoint.logout ( @QueryParam(OIDCLoginProtocol.REDIRECT_URI_PARAM) String  redirectUri,
@QueryParam("id_token_hint") String  encodedIdToken,
@QueryParam("post_logout_redirect_uri") String  postLogoutRedirectUri,
@QueryParam("state") String  state 
)
inline

Logout user session. User must be logged in via a session cookie.

引数
redirectUri
戻り値
99  {
100  String redirect = postLogoutRedirectUri != null ? postLogoutRedirectUri : redirectUri;
101 
102  if (redirect != null) {
103  String validatedUri = RedirectUtils.verifyRealmRedirectUri(session.getContext().getUri(), redirect, realm);
104  if (validatedUri == null) {
105  event.event(EventType.LOGOUT);
106  event.detail(Details.REDIRECT_URI, redirect);
107  event.error(Errors.INVALID_REDIRECT_URI);
108  return ErrorPage.error(session, null, Response.Status.BAD_REQUEST, Messages.INVALID_REDIRECT_URI);
109  }
110  redirect = validatedUri;
111  }
112 
113  UserSessionModel userSession = null;
114  if (encodedIdToken != null) {
115  try {
116  IDToken idToken = tokenManager.verifyIDTokenSignature(session, encodedIdToken);
117  userSession = session.sessions().getUserSession(realm, idToken.getSessionState());
118  } catch (OAuthErrorException e) {
119  event.event(EventType.LOGOUT);
120  event.error(Errors.INVALID_TOKEN);
121  return ErrorPage.error(session, null, Response.Status.BAD_REQUEST, Messages.SESSION_NOT_ACTIVE);
122  }
123  }
124 
125  // authenticate identity cookie, but ignore an access token timeout as we're logging out anyways.
126  AuthenticationManager.AuthResult authResult = AuthenticationManager.authenticateIdentityCookie(session, realm, false);
127  if (authResult != null) {
128  userSession = userSession != null ? userSession : authResult.getSession();
129  if (redirect != null) userSession.setNote(OIDCLoginProtocol.LOGOUT_REDIRECT_URI, redirect);
130  if (state != null) userSession.setNote(OIDCLoginProtocol.LOGOUT_STATE_PARAM, state);
131  userSession.setNote(AuthenticationManager.KEYCLOAK_LOGOUT_PROTOCOL, OIDCLoginProtocol.LOGIN_PROTOCOL);
132  logger.debug("Initiating OIDC browser logout");
133  Response response = AuthenticationManager.browserLogout(session, realm, authResult.getSession(), session.getContext().getUri(), clientConnection, headers);
134  logger.debug("finishing OIDC browser logout");
135  return response;
136  } else if (userSession != null) { // non browser logout
137  event.event(EventType.LOGOUT);
138  AuthenticationManager.backchannelLogout(session, realm, userSession, session.getContext().getUri(), clientConnection, headers, true);
139  event.user(userSession.getUser()).session(userSession).success();
140  }
141 
142  if (redirect != null) {
143  UriBuilder uriBuilder = UriBuilder.fromUri(redirect);
144  if (state != null) uriBuilder.queryParam(OIDCLoginProtocol.STATE_PARAM, state);
145  return Response.status(302).location(uriBuilder.build()).build();
146  } else {
147  return Response.ok().build();
148  }
149  }
IDToken verifyIDTokenSignature(KeycloakSession session, String encodedIDToken)
Definition: TokenManager.java:407
TokenManager tokenManager
Definition: LogoutEndpoint.java:78
ClientConnection clientConnection
Definition: LogoutEndpoint.java:70
KeycloakSession session
Definition: LogoutEndpoint.java:67
HttpHeaders headers
Definition: LogoutEndpoint.java:76
static final Logger logger
Definition: LogoutEndpoint.java:64
RealmModel realm
Definition: LogoutEndpoint.java:79

◆ logout() [2/2]

void org.keycloak.protocol.oidc.endpoints.LogoutEndpoint.logout ( UserSessionModel  userSession,
boolean  offline 
)
inlineprivate
212  {
213  AuthenticationManager.backchannelLogout(session, realm, userSession, session.getContext().getUri(), clientConnection, headers, true, offline);
214  event.user(userSession.getUser()).session(userSession).success();
215  }
ClientConnection clientConnection
Definition: LogoutEndpoint.java:70
KeycloakSession session
Definition: LogoutEndpoint.java:67
HttpHeaders headers
Definition: LogoutEndpoint.java:76
RealmModel realm
Definition: LogoutEndpoint.java:79

◆ logoutToken()

Response org.keycloak.protocol.oidc.endpoints.LogoutEndpoint.logoutToken ( )
inline

Logout a session via a non-browser invocation. Similar signature to refresh token except there is no grant_type. You must pass in the refresh token and authenticate the client if it is not public.

If the client is a confidential client you must include the client-id and secret in an Basic Auth Authorization header.

If the client is a public client, then you must include a "client_id" form parameter.

returns 204 if successful, 400 if not with a json error response.

戻り値
167  {
168  MultivaluedMap<String, String> form = request.getDecodedFormParameters();
169  checkSsl();
170 
171  event.event(EventType.LOGOUT);
172 
173  ClientModel client = authorizeClient();
174  String refreshToken = form.getFirst(OAuth2Constants.REFRESH_TOKEN);
175  if (refreshToken == null) {
176  event.error(Errors.INVALID_TOKEN);
177  throw new ErrorResponseException(OAuthErrorException.INVALID_REQUEST, "No refresh token", Response.Status.BAD_REQUEST);
178  }
179 
180  RefreshToken token = null;
181  try {
182  // KEYCLOAK-6771 Certificate Bound Token
183  token = tokenManager.verifyRefreshToken(session, realm, client, request, refreshToken, false);
184 
185  boolean offline = TokenUtil.TOKEN_TYPE_OFFLINE.equals(token.getType());
186 
187  UserSessionModel userSessionModel;
188  if (offline) {
189  UserSessionManager sessionManager = new UserSessionManager(session);
190  userSessionModel = sessionManager.findOfflineUserSession(realm, token.getSessionState());
191  } else {
192  userSessionModel = session.sessions().getUserSession(realm, token.getSessionState());
193  }
194 
195  if (userSessionModel != null) {
196  logout(userSessionModel, offline);
197  }
198  } catch (OAuthErrorException e) {
199  // KEYCLOAK-6771 Certificate Bound Token
200  if (MtlsHoKTokenUtil.CERT_VERIFY_ERROR_DESC.equals(e.getDescription())) {
201  event.error(Errors.NOT_ALLOWED);
202  throw new ErrorResponseException(e.getError(), e.getDescription(), Response.Status.UNAUTHORIZED);
203  } else {
204  event.error(Errors.INVALID_TOKEN);
205  throw new ErrorResponseException(e.getError(), e.getDescription(), Response.Status.BAD_REQUEST);
206  }
207  }
208 
209  return Cors.add(request, Response.noContent()).auth().allowedOrigins(session.getContext().getUri(), client).allowedMethods("POST").exposedHeaders(Cors.ACCESS_CONTROL_ALLOW_METHODS).build();
210  }
ClientModel authorizeClient()
Definition: LogoutEndpoint.java:217
TokenManager tokenManager
Definition: LogoutEndpoint.java:78
RefreshToken verifyRefreshToken(KeycloakSession session, RealmModel realm, String encodedRefreshToken)
Definition: TokenManager.java:346
KeycloakSession session
Definition: LogoutEndpoint.java:67
Response logout(@QueryParam(OIDCLoginProtocol.REDIRECT_URI_PARAM) String redirectUri, @QueryParam("id_token_hint") String encodedIdToken, @QueryParam("post_logout_redirect_uri") String postLogoutRedirectUri, @QueryParam("state") String state)
Definition: LogoutEndpoint.java:96
HttpRequest request
Definition: LogoutEndpoint.java:73
void checkSsl()
Definition: LogoutEndpoint.java:227
RealmModel realm
Definition: LogoutEndpoint.java:79

メンバ詳解

◆ clientConnection

ClientConnection org.keycloak.protocol.oidc.endpoints.LogoutEndpoint.clientConnection
private

◆ event

EventBuilder org.keycloak.protocol.oidc.endpoints.LogoutEndpoint.event
private

◆ headers

HttpHeaders org.keycloak.protocol.oidc.endpoints.LogoutEndpoint.headers
private

◆ logger

final Logger org.keycloak.protocol.oidc.endpoints.LogoutEndpoint.logger = Logger.getLogger(LogoutEndpoint.class)
staticprivate

◆ realm

RealmModel org.keycloak.protocol.oidc.endpoints.LogoutEndpoint.realm
private

◆ request

HttpRequest org.keycloak.protocol.oidc.endpoints.LogoutEndpoint.request
private

◆ session

KeycloakSession org.keycloak.protocol.oidc.endpoints.LogoutEndpoint.session
private

◆ tokenManager

TokenManager org.keycloak.protocol.oidc.endpoints.LogoutEndpoint.tokenManager
private

このクラス詳解は次のファイルから抽出されました: