A social knowledge tool for researchers built on ATProto
at development 82 lines 2.4 kB view raw
1/** 2 * Authentication utilities for the client-side application 3 */ 4 5import { TokenManager } from './TokenManager'; 6import { ClientTokenStorage } from './storage/ClientTokenStorage'; 7import { ServerTokenStorage } from './storage/ServerTokenStorage'; 8import { ApiTokenRefresher } from './TokenRefresher'; 9 10// Check if the user is authenticated 11export const isAuthenticated = (): boolean => { 12 if (typeof window === 'undefined') { 13 return false; // Not authenticated in server-side context 14 } 15 16 const accessToken = localStorage.getItem('accessToken'); 17 return !!accessToken; 18}; 19 20// Get the access token 21export const getAccessToken = (): string | null => { 22 if (typeof window === 'undefined') { 23 return null; 24 } 25 26 return localStorage.getItem('accessToken'); 27}; 28 29export const getAccessTokenInServerComponent = async (): Promise< 30 string | null 31> => { 32 // Get access token on server side 33 const { cookies } = await import('next/headers'); 34 const cookiesStore = await cookies(); 35 const accessToken = cookiesStore.get('accessToken')?.value || null; 36 return accessToken; 37}; 38 39// Get the refresh token 40export const getRefreshToken = (): string | null => { 41 if (typeof window === 'undefined') { 42 return null; 43 } 44 45 return localStorage.getItem('refreshToken'); 46}; 47 48// Clear authentication tokens (logout) 49export const clearAuth = (): void => { 50 if (typeof window === 'undefined') { 51 return; 52 } 53 54 localStorage.removeItem('accessToken'); 55 localStorage.removeItem('refreshToken'); 56}; 57 58// Client-side token manager 59export const createClientTokenManager = () => { 60 const storage = new ClientTokenStorage(); 61 const refresher = new ApiTokenRefresher( 62 process.env.NEXT_PUBLIC_API_BASE_URL || 'http://localhost:3000', 63 ); 64 return new TokenManager(storage, refresher); 65}; 66 67// Server-side token manager (read-only, no refresh capability) 68export const createServerTokenManager = async () => { 69 const { cookies } = await import('next/headers'); 70 const cookiesStore = await cookies(); 71 const storage = new ServerTokenStorage(cookiesStore); 72 const refresher = new ApiTokenRefresher(''); // Won't be used 73 return new TokenManager(storage, refresher); 74}; 75 76export const createExtensionTokenManager = () => { 77 const storage = new ClientTokenStorage(); 78 const refresher = new ApiTokenRefresher( 79 process.env.NEXT_PUBLIC_API_BASE_URL || 'http://localhost:3000', 80 ); 81 return new TokenManager(storage, refresher); 82};