React SDK
The @bastionauth/react package provides React components and hooks for authentication.
Installation
npm install @bastionauth/react
# or
pnpm add @bastionauth/react
# or
yarn add @bastionauth/reactSetup
Wrap your app with BastionProvider:
import { BastionProvider } from '@bastionauth/react';
function App() {
return (
<BastionProvider
publishableKey="pk_live_..."
apiUrl="https://auth-api.yourdomain.com"
>
<YourApp />
</BastionProvider>
);
}Components
SignIn
Pre-built sign-in form with OAuth support:
import { SignIn } from '@bastionauth/react';
function SignInPage() {
return (
<SignIn
signUpUrl="/sign-up"
afterSignInUrl="/dashboard"
providers={['google', 'github']}
/>
);
}SignUp
Pre-built sign-up form:
import { SignUp } from '@bastionauth/react';
function SignUpPage() {
return (
<SignUp
signInUrl="/sign-in"
afterSignUpUrl="/onboarding"
/>
);
}UserButton
User avatar dropdown with sign-out:
import { UserButton } from '@bastionauth/react';
function Header() {
return (
<header>
<nav>
<UserButton afterSignOutUrl="/" />
</nav>
</header>
);
}ProtectedRoute
Route wrapper requiring authentication:
import { ProtectedRoute } from '@bastionauth/react';
function Dashboard() {
return (
<ProtectedRoute fallback={<SignIn />}>
<DashboardContent />
</ProtectedRoute>
);
}Hooks
useAuth
Core authentication hook:
import { useAuth } from '@bastionauth/react';
function Profile() {
const {
isSignedIn,
isLoading,
user,
signOut,
getToken
} = useAuth();
if (isLoading) return <Spinner />;
if (!isSignedIn) return <SignIn />;
return (
<div>
<p>Welcome, {user.email}</p>
<button onClick={signOut}>Sign Out</button>
</div>
);
}useUser
Access and update user data:
import { useUser } from '@bastionauth/react';
function Settings() {
const { user, updateUser, isLoading } = useUser();
const handleUpdate = async () => {
await updateUser({
firstName: 'New Name',
});
};
return (
<form onSubmit={handleUpdate}>
<input defaultValue={user?.firstName} />
<button disabled={isLoading}>Save</button>
</form>
);
}useOrganization
Manage organizations:
import { useOrganization } from '@bastionauth/react';
function OrgSettings() {
const {
organization,
membership,
isAdmin
} = useOrganization();
return (
<div>
<h1>{organization?.name}</h1>
<p>Role: {membership?.role}</p>
{isAdmin && <AdminPanel />}
</div>
);
}Styling
Components use CSS variables for theming:
:root {
--bastion-primary: #00F0FF;
--bastion-background: #0A0E14;
--bastion-text: #F8FAFC;
--bastion-border: rgba(255, 255, 255, 0.1);
}Or use the appearance prop:
<SignIn
appearance={{
accentColor: '#7C3AED',
}}
/>