fix: login with sso when app using hash router (#1631)

* fix login with sso when app using hash router

* disable hash router
This commit is contained in:
Ajay Bura 2024-01-24 00:07:22 +11:00 committed by GitHub
parent 983d533452
commit 689adde8ae
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -8,9 +8,20 @@ import { PasswordLoginForm } from './PasswordLoginForm';
import { SSOLogin } from '../SSOLogin'; import { SSOLogin } from '../SSOLogin';
import { TokenLogin } from './TokenLogin'; import { TokenLogin } from './TokenLogin';
import { OrDivider } from '../OrDivider'; import { OrDivider } from '../OrDivider';
import { getLoginPath, getRegisterPath } from '../../pathUtils'; import { getLoginPath, getRegisterPath, withSearchParam } from '../../pathUtils';
import { usePathWithOrigin } from '../../../hooks/usePathWithOrigin'; import { usePathWithOrigin } from '../../../hooks/usePathWithOrigin';
import { LoginPathSearchParams } from '../../paths'; import { LoginPathSearchParams } from '../../paths';
import { useClientConfig } from '../../../hooks/useClientConfig';
const getLoginTokenSearchParam = () => {
// when using hasRouter query params in existing route
// gets ignored by react-router, so we need to read it ourself
// we only need to read loginToken as it's the only param that
// is provided by external entity. example: SSO login
const parmas = new URLSearchParams(window.location.search);
const loginToken = parmas.get('loginToken');
return loginToken ?? undefined;
};
const getLoginSearchParams = (searchParams: URLSearchParams): LoginPathSearchParams => ({ const getLoginSearchParams = (searchParams: URLSearchParams): LoginPathSearchParams => ({
username: searchParams.get('username') ?? undefined, username: searchParams.get('username') ?? undefined,
@ -20,10 +31,21 @@ const getLoginSearchParams = (searchParams: URLSearchParams): LoginPathSearchPar
export function Login() { export function Login() {
const server = useAuthServer(); const server = useAuthServer();
const { hashRouter } = useClientConfig();
const { loginFlows } = useAuthFlows(); const { loginFlows } = useAuthFlows();
const [searchParams] = useSearchParams(); const [searchParams] = useSearchParams();
const loginSearchParams = getLoginSearchParams(searchParams); const loginSearchParams = getLoginSearchParams(searchParams);
const ssoRedirectUrl = usePathWithOrigin(getLoginPath(server)); const ssoRedirectUrl = usePathWithOrigin(getLoginPath(server));
const loginTokenForHashRouter = getLoginTokenSearchParam();
const absoluteLoginPath = usePathWithOrigin(getLoginPath(server));
if (hashRouter?.enabled && loginTokenForHashRouter) {
window.location.replace(
withSearchParam(absoluteLoginPath, {
loginToken: loginTokenForHashRouter,
})
);
}
const parsedFlows = useParsedLoginFlows(loginFlows.flows); const parsedFlows = useParsedLoginFlows(loginFlows.flows);