@insforge/react
Complete authentication solution for React applications. Production-ready components with full business logic included.
Why @insforge/react?
✅ 5-Minute Setup - One provider + one line of router config = done
✅ Built-in Auth UI - Use deployed auth pages (like Next.js middleware)
✅ Framework Agnostic - Works with any React framework
✅ Full TypeScript - Complete type safety out of the box
Quick Start
Get authentication working in your React app in 5 minutes.
1. Install
npm install @insforge/react
yarn add @insforge/react
pnpm add @insforge/react
2. Setup Provider
Wrap your app with InsforgeProvider:
import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import { InsforgeProvider } from '@insforge/react';
import '@insforge/react/styles.css';
import App from './App';
createRoot(document.getElementById('root')!).render(
<StrictMode>
<InsforgeProvider
baseUrl={import.meta.env.VITE_INSFORGE_BASE_URL}
afterSignInUrl="/dashboard"
>
<App />
</InsforgeProvider>
</StrictMode>
);
3. Configure Router (Built-in Auth)
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
import { getInsforgeRoutes } from '@insforge/react/router';
import Home from './pages/Home';
import Dashboard from './pages/Dashboard';
const router = createBrowserRouter([
{ path: '/', element: <Home /> },
...getInsforgeRoutes({
baseUrl: import.meta.env.VITE_INSFORGE_BASE_URL,
builtInAuth: true
}),
{ path: '/dashboard', element: <Dashboard /> }
]);
export default function App() {
return <RouterProvider router={router} />;
}
What this does:
- Visiting
/sign-in → Redirects to your-project.insforge.app/auth/sign-in
- Visiting
/sign-up → Redirects to your-project.insforge.app/auth/sign-up
- After auth → Backend redirects with token in URL → SDK auto-detects and stores token
4. Add Auth UI to Your Pages
import { SignedIn, SignedOut, UserButton } from '@insforge/react';
export default function Home() {
return (
<div>
<nav>
<SignedOut>
<a href="/sign-in">Sign In</a>
</SignedOut>
<SignedIn>
<UserButton afterSignOutUrl="/" />
</SignedIn>
</nav>
<h1>Welcome to My App!</h1>
</div>
);
}
That's it! 🎉 You now have production-ready authentication.
Router Configuration Options
Built-in Auth (Recommended)
Uses your deployed Insforge auth pages (includes all flows):
...getInsforgeRoutes({
baseUrl: 'https://your-project.insforge.app',
builtInAuth: true,
paths: {
signIn: '/sign-in',
signUp: '/sign-up',
verifyEmail: '/verify-email',
forgotPassword: '/forgot-password',
resetPassword: '/reset-password'
}
})
Custom UI Components
Use package components with your own styling:
import {
SignIn,
SignUp,
ForgotPassword,
ResetPassword,
VerifyEmail
} from '@insforge/react';
const router = createBrowserRouter([
{ path: '/', element: <Home /> },
{ path: '/sign-in', element: <SignIn afterSignInUrl="/dashboard" /> },
{ path: '/sign-up', element: <SignUp afterSignUpUrl="/dashboard" /> },
{ path: '/forgot-password', element: <ForgotPassword backToSignInUrl="/sign-in" /> },
{ path: '/reset-password', element: <ResetPassword token={searchParams.get('token')} /> },
{ path: '/verify-email', element: <VerifyEmail token={searchParams.get('token')} /> }
]);
Fully Custom UI
Build your own auth pages from scratch:
import { useAuth } from '@insforge/react';
function CustomSignIn() {
const { signIn } = useAuth();
const handleSubmit = async (e) => {
e.preventDefault();
await signIn(email, password);
navigate('/dashboard');
};
return <form onSubmit={handleSubmit}>...</form>;
}
Core Features
Components
Pre-built with Business Logic:
<SignIn /> - Complete sign-in with email/password & OAuth
<SignUp /> - Registration with password validation & email verification
<ForgotPassword /> - Request password reset with email validation
<ResetPassword /> - Reset password with token validation
<VerifyEmail /> - Verify email with automatic token handling
<UserButton /> - User dropdown with sign-out
<Protect /> - Route protection wrapper
<SignedIn> / <SignedOut> - Conditional rendering
Form Components (Pure UI):
<SignInForm /> - Sign-in UI without logic
<SignUpForm /> - Sign-up UI without logic
<ForgotPasswordForm /> - Password reset request UI
<ResetPasswordForm /> - Password reset with token UI
<VerifyEmailStatus /> - Email verification status UI
Atomic Components (14 total):
<AuthContainer />, <AuthHeader />, <AuthFormField />, <AuthPasswordField />, <AuthEmailVerificationStep />, etc.
Hooks
const { signIn, signUp, signOut, isSignedIn, isLoaded } = useAuth();
const { user, updateUser, isLoaded } = useUser();
const { oauthProviders, authConfig, isLoaded } = usePublicAuthConfig();
Customization
Text Customization
All components support full text customization:
<SignIn
title="Welcome Back!"
subtitle="We're happy to see you again"
emailLabel="Your Email Address"
emailPlaceholder="you@company.com"
passwordLabel="Your Password"
submitButtonText="Login Now"
loadingButtonText="Signing you in..."
signUpText="New to our platform?"
signUpLinkText="Create an account"
dividerText="or continue with"
/>
<ForgotPassword
title="Reset Your Password"
subtitle="Enter your email to receive a reset code"
emailLabel="Email Address"
submitButtonText="Send Reset Code"
backToSignInText="Remember your password?"
successTitle="Check Your Email"
successMessage="We've sent a reset code to your inbox"
/>
Advanced Usage
Complete Component with Custom Logic
import { SignInForm, useAuth } from '@insforge/react';
import { useState } from 'react';
function CustomSignIn() {
const { signIn } = useAuth();
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [error, setError] = useState('');
const [loading, setLoading] = useState(false);
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
setLoading(true);
setError('');
try {
await signIn(email, password);
} catch (err) {
setError(err.message);
} finally {
setLoading(false);
}
};
return (
<SignInForm
email={email}
password={password}
onEmailChange={setEmail}
onPasswordChange={setPassword}
onSubmit={handleSubmit}
error={error}
loading={loading}
availableProviders={['google', 'github']}
onOAuthClick={(provider) => {
// Custom OAuth logic
}}
/>
);
}
Build from Atomic Components
import {
AuthContainer,
AuthHeader,
AuthFormField,
AuthPasswordField,
AuthSubmitButton,
AuthErrorBanner,
AuthDivider,
AuthOAuthProviders,
AuthLink,
} from '@insforge/react';
function CompletelyCustomAuth() {
return (
<AuthContainer>
<AuthHeader
title="Welcome to MyApp"
subtitle="Sign in to continue"
/>
<AuthErrorBanner error={error} />
<form onSubmit={handleSubmit}>
<AuthFormField
id="email"
type="email"
label="Email"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
<AuthPasswordField
id="password"
label="Password"
value={password}
onChange={(e) => setPassword(e.target.value)}
authConfig={config}
showStrengthIndicator
/>
<AuthSubmitButton isLoading={loading}>
Sign In
</AuthSubmitButton>
</form>
<AuthDivider text="or" />
<AuthOAuthProviders
providers={['google', 'github', 'discord']}
onClick={handleOAuth}
loading={oauthLoading}
/>
<AuthLink
text="Don't have an account?"
linkText="Sign up"
href="/sign-up"
/>
</AuthContainer>
);
}
Route Protection
import { Protect } from '@insforge/react';
function Dashboard() {
return (
<div>
<h1>Dashboard</h1>
{/* Simple protection */}
<Protect redirectTo="/sign-in">
<UserContent />
</Protect>
{/* Role-based protection */}
<Protect
redirectTo="/unauthorized"
condition={(user) => user.role === 'admin'}
>
<AdminPanel />
</Protect>
</div>
);
}
TypeScript
Full TypeScript support with exported types:
import type {
InsforgeUser,
SignInProps,
SignUpProps,
ForgotPasswordProps,
ResetPasswordProps,
VerifyEmailProps,
UserButtonProps,
ProtectProps,
ConditionalProps,
SignInFormProps,
SignUpFormProps,
ForgotPasswordFormProps,
ResetPasswordFormProps,
VerifyEmailStatusProps,
AuthFormFieldProps,
OAuthProvider,
AuthConfig,
InsforgeProviderProps,
GetInsforgeRoutesConfig,
} from '@insforge/react';
OAuth Providers
Built-in support for 10+ OAuth providers:
- Google
- GitHub
- Discord
- Apple
- Microsoft
- Facebook
- LinkedIn
- Instagram
- TikTok
- Spotify
- X (Twitter)
Providers are auto-detected from your backend configuration.
Validation Utilities
import { emailSchema, cn } from '@insforge/react/lib';
const result = emailSchema.safeParse('user@example.com');
const className = cn('px-4 py-2', 'bg-blue-500', conditionalClass);
Available Atomic Components
Low-level building blocks for complete customization:
<AuthBranding /> - Insforge branding footer
<AuthContainer /> - Main container wrapper
<AuthHeader /> - Title and subtitle display
<AuthErrorBanner /> - Error message display
<AuthFormField /> - Standard input field
<AuthPasswordField /> - Password input with features
<AuthPasswordStrengthIndicator /> - Password checklist
<AuthSubmitButton /> - Submit button with states
<AuthLink /> - Call-to-action link
<AuthDivider /> - Visual separator
<AuthOAuthButton /> - Single OAuth provider button
<AuthOAuthProviders /> - Smart OAuth grid
<AuthVerificationCodeInput /> - 6-digit OTP input
<AuthEmailVerificationStep /> - Email verification step with countdown and resend
Support
License
MIT © Insforge