Pass id_token_hint explicitly to signoutRedirect() so Authentik honors the post_logout_redirect_uri and sends users back to the app.
48 lines
1.3 KiB
TypeScript
48 lines
1.3 KiB
TypeScript
import { User, UserManager } from 'oidc-client-ts';
|
|
import { oidcConfig } from './config';
|
|
import { parseOidcError, type AuthError } from './errors';
|
|
|
|
const userManager = new UserManager(oidcConfig);
|
|
|
|
export const login = async (): Promise<void> => {
|
|
try {
|
|
await userManager.signinRedirect();
|
|
} catch (error) {
|
|
console.error('Login redirect failed:', error);
|
|
throw parseOidcError(error);
|
|
}
|
|
};
|
|
|
|
export const logout = async (): Promise<void> => {
|
|
try {
|
|
const user = await userManager.getUser();
|
|
await userManager.signoutRedirect({
|
|
id_token_hint: user?.id_token,
|
|
});
|
|
} catch (error) {
|
|
console.error('Logout redirect failed:', error);
|
|
throw parseOidcError(error);
|
|
}
|
|
};
|
|
|
|
export const handleCallback = async (): Promise<User> => {
|
|
try {
|
|
const user = await userManager.signinRedirectCallback();
|
|
return user;
|
|
} catch (error) {
|
|
console.error('Callback handling failed:', error);
|
|
throw parseOidcError(error);
|
|
}
|
|
};
|
|
|
|
export const getUser = async (): Promise<User | null> => {
|
|
try {
|
|
const user = await userManager.getUser();
|
|
return user;
|
|
} catch (error) {
|
|
console.error('Error fetching user:', error);
|
|
return null;
|
|
}
|
|
};
|
|
|
|
export type { AuthError };
|