apereo/cas · warning

No (successful) logout response received from the url

Error message

No (successful) logout response received from the url [{}]

What it means

During OpenID Connect single logout, CAS notifies each registered relying party's logout URL with an HTTP request. This warning is logged when the HTTP call completes without receiving a successful (2xx) logout response from the endpoint, and the affected service is skipped (the method returns false). It means the relying party did not confirm the logout request.

Solutions

  1. Verify the service's logout URL is correct and reachable from the CAS server (curl the URL from the CAS host).
  2. Check CAS logs for the underlying HTTP exception/stack trace to distinguish connection failure from an HTTP error status.
  3. Confirm the RP logout endpoint accepts the CAS SLO message format and returns a 2xx response.
  4. If the RP certificate is self-signed, import it into the CAS trust store or fix TLS configuration.
  5. Re-test logout for that specific registered service; the failure only skips one RP, others still receive logout notifications.

Example fix

// before (service definition JSON)
"logoutUrl": "https://rp.example.com/old-logout-path"
// after
"logoutUrl": "https://rp.example.com/cas-oidc/logout"
Defensive patterns

Strategy: validation

Validate before calling

// Verify the logout endpoint from the CAS host before registering the service:
boolean isLogoutUrlReachable(String url) throws Exception {
    HttpURLConnection c = (HttpURLConnection) new URL(url).openConnection();
    c.setConnectTimeout(5000);
    c.setRequestMethod("POST");
    int code = c.getResponseCode();
    return code >= 200 && code < 300;
}

Prevention

When it happens

Trigger: sendMessageToEndpoint posts the logout message to the registered service's logout URL via HttpUtils; the response code is not 2xx, the connection fails before a response arrives, or the response object is unusable before the success check.

Common situations: Relying party logout endpoint down or behind a firewall/proxy rejecting CAS traffic; logout URL in the OIDC service definition is wrong or uses https with an untrusted certificate; RP rejects the logout payload and returns 4xx; DNS/network issues from the CAS server host or container.

Understand the failure class

Background: 'Something went wrong' / 'Request failed (500)' / 'HTTP error! status: 404' — what failed HTTP requests actually mean and how to find the real cause — this error's family across 28 libraries.

Related errors


AI-assisted analysis of apereo/cas@e7288fc434 (2026-09-08). Data as JSON: /api/errors/729c66e127dc1dc3. Report an issue: GitHub.

Appendix: source

Thrown at support/cas-server-support-oidc-core-api/src/main/java/org/apereo/cas/oidc/slo/OidcSingleLogoutServiceMessageHandler.java:116

        val payload = logoutMessage.getPayload();
        HttpResponse response = null;
        try {
            val exec = HttpExecutionRequest.builder()
                .method(HttpMethod.POST)
                .url(msg.getUrl().toExternalForm())
                .entity("logout_token=" + payload)
                .headers(CollectionUtils.wrap(HttpHeaders.CONTENT_TYPE, msg.getContentType()))
                .httpClient(getHttpClient())
                .build();
            response = HttpUtils.execute(exec);
            if (response != null && !Objects.requireNonNull(HttpStatus.resolve(response.getCode())).isError()) {
                LOGGER.trace("Received logout response [{}]", response.getCode());
                return true;
            }
        } finally {
            HttpUtils.close(response);
        }
        LOGGER.warn("No (successful) logout response received from the url [{}]", msg.getUrl().toExternalForm());
        return false;
    }
}

View on GitHub (pinned to e7288fc434)