React Quickstart
Add Nebutra authentication and permission gates to any React application.
Prerequisites
- React 18+
- A Nebutra account with an OPC license (free)
Step 1: Install the SDK
npm install @nebutra/sdk @nebutra/reactpnpm add @nebutra/sdk @nebutra/reactStep 2: Wrap your app with NebutraProvider
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import { NebutraProvider } from "@nebutra/react";
import App from "./App";
createRoot(document.getElementById("root")!).render(
<StrictMode>
<NebutraProvider
orgId={import.meta.env.VITE_NEBUTRA_ORG_ID}
apiUrl="https://api.nebutra.com"
>
<App />
</NebutraProvider>
</StrictMode>
);Step 3: Access auth state with hooks
import { useNebutraUser, useNebutraOrg } from "@nebutra/react";
export function UserMenu() {
const { user, isLoaded, isSignedIn } = useNebutraUser();
const { org } = useNebutraOrg();
if (!isLoaded) return <Skeleton />;
if (!isSignedIn) return <SignInButton />;
return (
<div>
<p>{user.fullName}</p>
<p>{org.name} ยท {org.plan}</p>
</div>
);
}Step 4: Gate UI with permission checks
import { Can } from "@nebutra/react";
export function DeleteButton({ projectId }: { projectId: string }) {
return (
<Can action="delete" resource="Project">
<button onClick={() => handleDelete(projectId)}>
Delete Project
</button>
</Can>
);
}The <Can> component renders nothing if the current user lacks the required scope โ no extra logic needed.
Step 5: Protect a route
import { useNebutraUser } from "@nebutra/react";
import { Navigate } from "react-router-dom";
export function ProtectedRoute({ children }: { children: React.ReactNode }) {
const { isLoaded, isSignedIn } = useNebutraUser();
if (!isLoaded) return <LoadingSpinner />;
if (!isSignedIn) return <Navigate to="/sign-in" />;
return <>{children}</>;
}Step 6: Make authenticated API requests
import { useNebutraToken } from "@nebutra/react";
export function useProjects() {
const { getToken } = useNebutraToken();
return async function fetchProjects() {
const token = await getToken();
const res = await fetch("/api/projects", {
headers: { Authorization: `Bearer ${token}` },
});
return res.json();
};
}Next steps
How is this guide?
Edit on GitHub
Last updated on