@evup/auth-sdk
v0.2.2
Published
OAuth 2.1 and Device Authorization SDK for EvUp
Readme
@evup/auth-sdk
OAuth SDK for Next.js and JavaScript applications.
Structure
src/
├── core/ # Framework-agnostic code
│ ├── types.ts # Shared types
│ ├── token-store.ts # Token storage
│ ├── session.ts # Session utilities
│ └── env.ts # Environment config
│
└── nextjs/ # Next.js specific
├── client.ts # AuthClient
├── react.tsx # AuthProvider, useAuth, useUser
└── middleware.ts # requireAuth, optionalAuthInstallation
npm install @evup/auth-sdkEnvironment Variables
NEXT_PUBLIC_AUTH_URL=https://evup.cloud
NEXT_PUBLIC_AUTH_CLIENT_ID=your-client-id
NEXT_PUBLIC_AUTH_REDIRECT_URI=https://yourapp.com/callback
NEXT_PUBLIC_AUTH_SCOPES=openid profile emailReact
Setup
import { AuthProvider } from "@evup/auth-sdk/react";
<AuthProvider>
<App />
</AuthProvider>Use in component
import { useAuth } from "@evup/auth-sdk/react";
function Profile() {
const { user, login, logout, isAuthenticated, loading } = useAuth();
if (loading) return <Spinner />;
if (!isAuthenticated) return <button onClick={login}>Login</button>;
return (
<div>
<p>Hello {user?.name}</p>
<button onClick={logout}>Logout</button>
</div>
);
}React API
| Function | Description | Returns |
|----------|-------------|---------|
| AuthProvider | App wrapper | React Component |
| useAuth() | Auth state and methods | { user, login, logout, refresh, isAuthenticated, loading } |
| useUser() | Current user only | SessionUser \| null |
Client (Vanilla JS)
import { AuthClient } from "@evup/auth-sdk";
const auth = new AuthClient({
baseUrl: "https://evup.cloud",
clientId: "your-client-id",
redirectUri: "https://yourapp.com/callback",
});
await auth.login();
const user = await auth.handleCallback();
const user = await auth.getUser();
await auth.logout();
await auth.refreshToken();Client API
| Method | Description | Returns |
|--------|-------------|---------|
| login() | Redirect to OAuth login | Promise<void> |
| handleCallback() | Handle OAuth callback | Promise<SessionUser \| null> |
| getUser() | Get current user | Promise<SessionUser \| null> |
| logout() | Clear tokens | Promise<void> |
| refreshToken() | Refresh access token | Promise<boolean> |
| isAuthenticated() | Check login status | boolean |
| getAccessToken() | Get access token | string \| null |
Server (Next.js)
Server Components
import { getUser } from "@evup/auth-sdk/server";
async function Page() {
const cookieHeader = headers().get("cookie");
const user = await getUser({}, cookieHeader);
if (!user) redirect("/login");
return <div>Hello {user.name}</div>;
}API Routes
import { requireAuth, optionalAuth } from "@evup/auth-sdk/server";
// Required auth - returns 401 if not logged in
export async function GET(req: Request) {
const user = await requireAuth(req, res);
return Response.json({ user });
}
// Optional auth - returns null if not logged in
export async function GET(req: Request) {
const user = await optionalAuth(req);
return Response.json({ user });
}Server API
| Function | Description | Returns |
|----------|-------------|---------|
| getUser(config, cookieHeader) | Get user from session | Promise<SessionUser \| null> |
| getSession(config, cookieHeader) | Get full session | Promise<SessionResponse> |
| extractBearerToken(header) | Extract token from header | string \| null |
| validateToken(config, token) | Validate access token | Promise<SessionUser \| null> |
| requireAuth(req, res, config?) | Require authentication | Promise<SessionUser> |
| optionalAuth(req, config?) | Optional authentication | Promise<SessionUser \| null> |
Environment Variables
| Variable | Scope | Description |
|----------|-------|-------------|
| NEXT_PUBLIC_AUTH_URL | Client + Server | Base URL |
| NEXT_PUBLIC_AUTH_CLIENT_ID | Client | OAuth client ID |
| NEXT_PUBLIC_AUTH_REDIRECT_URI | Client | OAuth redirect URI |
| NEXT_PUBLIC_AUTH_SCOPES | Client | OAuth scopes |
Types
interface SessionUser {
id: string;
email: string;
name?: string;
image?: string;
role?: string;
}
interface ServerConfig {
baseUrl: string;
}
interface AuthSDKConfig {
baseUrl: string;
clientId: string;
redirectUri: string;
scopes?: string;
}License
MIT
