prefer using providers conf from supabase instead of env
This commit is contained in:
102
packages/shared/src/config/dynamic-auth.config.ts
Normal file
102
packages/shared/src/config/dynamic-auth.config.ts
Normal file
@@ -0,0 +1,102 @@
|
||||
import type { Provider } from '@supabase/supabase-js';
|
||||
import { z } from 'zod';
|
||||
import { createAuthProvidersService } from './auth-providers.service';
|
||||
|
||||
const providers: z.ZodType<Provider> = getProviders();
|
||||
|
||||
const DynamicAuthConfigSchema = z.object({
|
||||
providers: z.object({
|
||||
password: z.boolean().describe('Enable password authentication.'),
|
||||
magicLink: z.boolean().describe('Enable magic link authentication.'),
|
||||
oAuth: providers.array(),
|
||||
}),
|
||||
displayTermsCheckbox: z.boolean().describe('Whether to display the terms checkbox during sign-up.'),
|
||||
});
|
||||
|
||||
export async function getDynamicAuthConfig() {
|
||||
const authService = createAuthProvidersService();
|
||||
const dynamicProviders = await authService.getAuthConfig();
|
||||
|
||||
const config = {
|
||||
providers: dynamicProviders.providers,
|
||||
displayTermsCheckbox: dynamicProviders.displayTermsCheckbox,
|
||||
};
|
||||
|
||||
return DynamicAuthConfigSchema.parse(config);
|
||||
}
|
||||
|
||||
export async function getCachedAuthConfig() {
|
||||
if (typeof window !== 'undefined') {
|
||||
const cached = sessionStorage.getItem('auth-config');
|
||||
if (cached) {
|
||||
try {
|
||||
const { data, timestamp } = JSON.parse(cached);
|
||||
// Cache for 5 minutes
|
||||
if (Date.now() - timestamp < 5 * 60 * 1000) {
|
||||
return data;
|
||||
}
|
||||
} catch (error) {
|
||||
console.warn('Invalid auth config cache:', error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const config = await getDynamicAuthConfig();
|
||||
|
||||
if (typeof window !== 'undefined') {
|
||||
try {
|
||||
sessionStorage.setItem('auth-config', JSON.stringify({
|
||||
data: config,
|
||||
timestamp: Date.now(),
|
||||
}));
|
||||
} catch (error) {
|
||||
console.warn('Failed to cache auth config:', error);
|
||||
}
|
||||
}
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
export async function getServerAuthConfig() {
|
||||
return getDynamicAuthConfig();
|
||||
}
|
||||
|
||||
export async function isProviderEnabled(provider: 'password' | 'magicLink' | Provider): Promise<boolean> {
|
||||
const authService = createAuthProvidersService();
|
||||
const settings = await authService.fetchAuthSettings();
|
||||
|
||||
switch (provider) {
|
||||
case 'password':
|
||||
return authService.isPasswordEnabled({ settings });
|
||||
case 'magicLink':
|
||||
return authService.isMagicLinkEnabled();
|
||||
default:
|
||||
return authService.isOAuthProviderEnabled({ provider, settings });
|
||||
}
|
||||
}
|
||||
|
||||
function getProviders() {
|
||||
return z.enum([
|
||||
'apple',
|
||||
'azure',
|
||||
'bitbucket',
|
||||
'discord',
|
||||
'facebook',
|
||||
'figma',
|
||||
'github',
|
||||
'gitlab',
|
||||
'google',
|
||||
'kakao',
|
||||
'keycloak',
|
||||
'linkedin',
|
||||
'linkedin_oidc',
|
||||
'notion',
|
||||
'slack',
|
||||
'spotify',
|
||||
'twitch',
|
||||
'twitter',
|
||||
'workos',
|
||||
'zoom',
|
||||
'fly',
|
||||
]);
|
||||
}
|
||||
Reference in New Issue
Block a user