Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions SparkyFitnessFrontend/.eslintignore

This file was deleted.

25 changes: 8 additions & 17 deletions SparkyFitnessFrontend/src/api/Auth/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,10 +111,14 @@ export const logoutUser = async (): Promise<void> => {
window.location.href = '/';
};

export const initiateOidcLogin = async (
providerId: string,
requestSignUp: boolean = false
) => {
export interface OidcLoginParams {
providerId: string;
requestSignUp?: boolean;
}
export const initiateOidcLogin = async ({
providerId,
requestSignUp = false,
}: OidcLoginParams) => {
await authClient.signIn.sso({
providerId: providerId,
callbackURL: window.location.origin,
Expand All @@ -123,19 +127,6 @@ export const initiateOidcLogin = async (
});
};

// eslint-disable-next-line @typescript-eslint/no-explicit-any
export const getOidcProviders = async (): Promise<any[]> => {
const response = await fetch('/api/auth/settings');
if (!response.ok) return [];
const data = await response.json();
return data.oidc?.providers || [];
};

export const checkOidcAvailability = async (): Promise<boolean> => {
const providers = await getOidcProviders();
return providers.length > 0;
};

export const getLoginSettings = async (): Promise<LoginSettings> => {
const response = await fetch('/api/auth/settings');
if (!response.ok) {
Expand Down
17 changes: 1 addition & 16 deletions SparkyFitnessFrontend/src/hooks/Auth/useAuth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import {
loginUser,
verifyMagicLink,
getLoginSettings,
getOidcProviders,
initiateOidcLogin,
resetPassword,
requestPasswordReset,
Expand Down Expand Up @@ -96,24 +95,10 @@ export const useAuthSettings = () => {
});
};

export const useOidcProvidersQuery = (enabled: boolean) => {
return useQuery({
queryKey: authKeys.oidcProviders,
queryFn: getOidcProviders,
enabled: enabled,
});
};

export const useInitiateOidcLoginMutation = () => {
const { t } = useTranslation();
return useMutation({
mutationFn: ({
providerId,
requestSignUp = false,
}: {
providerId: string;
requestSignUp?: boolean;
}) => initiateOidcLogin(providerId, requestSignUp),
mutationFn: initiateOidcLogin,
meta: {
// Kein Success-Message nötig, da Redirect erfolgt
errorMessage: t('auth.oidcError', 'Failed to initiate provider login.'),
Expand Down
32 changes: 12 additions & 20 deletions SparkyFitnessFrontend/src/pages/Auth/Auth.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ import {
useAuthSettings,
useInitiateOidcLoginMutation,
useLoginUserMutation,
useOidcProvidersQuery,
useRegisterUserMutation,
useRequestMagicLinkMutation,
useVerifyMagicLinkMutation,
Expand Down Expand Up @@ -58,9 +57,6 @@ const Auth = () => {

const queryClient = useQueryClient();
const { data: loginSettings } = useAuthSettings();
const { data: oidcProviders } = useOidcProvidersQuery(
!!loginSettings?.oidc?.enabled
);
const { mutateAsync: loginUser } = useLoginUserMutation();
const { mutateAsync: registerUser } = useRegisterUserMutation();
const { mutateAsync: requestMagicLink } = useRequestMagicLinkMutation();
Expand All @@ -80,28 +76,23 @@ const Auth = () => {
try {
if (
loginSettings &&
oidcProviders.length === 1 &&
loginSettings.oidc.providers.length === 1 &&
loginSettings.oidc.enabled
) {
const providers = oidcProviders[0];
const provider = loginSettings.oidc.providers[0];

// AUTO-REDIRECT LOGIC: Only when email is disabled and exactly 1 OIDC provider is active
if (
!loginSettings.email.enabled &&
providers.length === 1 &&
!authUser &&
!authLoading
) {
if (!loginSettings.email.enabled && !authUser && !authLoading) {
console.log(
'Auth Page: Auto-redirecting to OIDC provider:',
providers[0].id
provider.id
);
// Safety timeout to catch any late-arriving sessions
const timer = setTimeout(() => {
if (!authUser) {
initiateOidcLogin({
providerId: providers[0].id,
requestSignUp: providers[0].auto_register,
providerId: provider.id,
requestSignUp: provider.auto_register,
});
}
}, 800);
Expand All @@ -118,7 +109,7 @@ const Auth = () => {
};
fetchAuthSettings();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [loggingLevel, authUser, authLoading, navigate]);
}, [loggingLevel, authUser, authLoading, navigate, loginSettings]);

// Passkey Conditional UI (Autofill)
useEffect(() => {
Expand Down Expand Up @@ -476,7 +467,7 @@ const Auth = () => {
) : showMfaChallenge ? (
<MfaChallenge {...mfaChallengeProps} />
) : (
<Card className="w-full max-w-md dark:bg-gray-">
<Card className="w-full max-w-md">
<CardHeader className="text-center">
<div className="flex items-center justify-center mb-4">
<img
Expand Down Expand Up @@ -607,7 +598,7 @@ const Auth = () => {
</Button>
{loginSettings?.oidc.enabled && (
<>
{oidcProviders?.map((provider) => (
{loginSettings.oidc.providers?.map((provider) => (
<Button
key={provider.id}
variant="outline"
Expand Down Expand Up @@ -710,8 +701,9 @@ const Auth = () => {
</Tabs>
) : (
<div>
{loginSettings?.oidc.enabled && oidcProviders?.length > 0 ? (
oidcProviders.map((provider) => (
{loginSettings?.oidc.enabled &&
loginSettings.oidc.providers?.length > 0 ? (
loginSettings.oidc.providers.map((provider) => (
<Button
key={provider.id}
variant="outline"
Expand Down