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/react
pnpm add @nebutra/sdk @nebutra/react

Step 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

On this page