@wristband/nextjs-auth
Version:
SDK for integrating your Next.js application with Wristband. Handles user authentication, session management, and token management.
70 lines (69 loc) • 2.65 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getSessionFromRequest = getSessionFromRequest;
const typescript_session_1 = require("@wristband/typescript-session");
/**
* Get session from NextRequest.
*
* **For Next.js middleware/proxy and App Router route handlers.**
* Returns a full session with all methods available (save, destroy, saveToResponse, etc.)
*
* For Pages Router route handlers and getServerSideProps, use getPagesRouterSession().
* For Server Components (read-only), use getReadOnlySessionFromCookies().
* For Server Actions (mutable), use getMutableSessionFromCookies().
*
* @template T - Session data type extending SessionData
* @param request - Next.js NextRequest object
* @param options - Session configuration options
* @returns Promise resolving to a full session instance with all methods
*
* @example
* ```typescript
* // In middleware/proxy
* import { NextRequest, NextResponse } from 'next/server';
* import { getSessionFromRequest } from '@wristband/nextjs-auth';
*
* const sessionOptions = {
* secrets: process.env.SESSION_SECRET!,
* cookieName: 'my-session'
* };
*
* export async function middleware(request: NextRequest) {
* const session = await getSessionFromRequest(request, sessionOptions);
*
* if (!session.accessToken) {
* return NextResponse.redirect(new URL('/login', request.url));
* }
*
* return NextResponse.next();
* }
*
* // In App Router route handler
* import { NextRequest, NextResponse } from 'next/server';
* import { getSessionFromRequest } from '@wristband/nextjs-auth';
*
* export async function POST(request: NextRequest) {
* const session = await getSessionFromRequest(request, sessionOptions);
* session.set('theme', theme);
* return await session.saveToResponse(NextResponse.json({ ok: true }));
* }
* ```
*
* @see {@link getReadOnlySessionFromCookies} For Server Components (read-only)
* @see {@link getMutableSessionFromCookies} For Server Actions (mutable)
* @see {@link getPagesRouterSession} For Pages Router
*/
async function getSessionFromRequest(request, options) {
// Build cookie string from cookies API to include any modifications made via cookies.set().
const cookies = request.cookies.getAll();
const cookieHeader = cookies
.map((c) => {
return `${c.name}=${c.value}`;
})
.join('; ');
// Create standard Request with current cookie state
const standardRequest = new Request(request.url, {
headers: { cookie: cookieHeader },
});
return (0, typescript_session_1.getSession)(standardRequest, options);
}