This affects login_required sites which use SSO or have only one authenticator enabled. Previously, logging out would redirect to the homepage, which would then redirect to the identity provider. Now, users will be redirected to the Discourse login page. This avoids the confusing situation where a user appears to remain logged in after clicking logout. Sites which have explicitly defined a logout_redirect url are not affected by this change. For context, see https://meta.discourse.org/t/134138/2
32 lines
1.0 KiB
JavaScript
32 lines
1.0 KiB
JavaScript
import { isEmpty } from "@ember/utils";
|
|
import { findAll } from "discourse/models/login-method";
|
|
|
|
export default function logout(siteSettings, keyValueStore) {
|
|
if (!siteSettings || !keyValueStore) {
|
|
const container = Discourse.__container__;
|
|
siteSettings = siteSettings || container.lookup("site-settings:main");
|
|
keyValueStore = keyValueStore || container.lookup("key-value-store:main");
|
|
}
|
|
|
|
keyValueStore.abandonLocal();
|
|
|
|
const redirect = siteSettings.logout_redirect;
|
|
if (!isEmpty(redirect)) {
|
|
window.location.href = redirect;
|
|
return;
|
|
}
|
|
|
|
const sso = siteSettings.enable_sso;
|
|
const oneAuthenticator =
|
|
!siteSettings.enable_local_logins && findAll().length === 1;
|
|
|
|
if (siteSettings.login_required && (sso || oneAuthenticator)) {
|
|
// In this situation visiting most URLs will start the auth process again
|
|
// Go to the `/login` page to avoid an immediate redirect
|
|
window.location.href = Discourse.getURL("/login");
|
|
return;
|
|
}
|
|
|
|
window.location.href = Discourse.getURL("/");
|
|
}
|