51 lines
1.3 KiB
TypeScript
51 lines
1.3 KiB
TypeScript
import { auth, currentUser } from "@clerk/nextjs/server";
|
|
import { NextRequest } from "next/server";
|
|
import log from "./logger";
|
|
|
|
/**
|
|
* Get authenticated user ID from request
|
|
* Handles both session-based auth (web) and Bearer token auth (mobile)
|
|
*
|
|
* For mobile apps using Clerk Expo, tokens should be passed as:
|
|
* Authorization: Bearer <token>
|
|
*/
|
|
export async function getAuthUserId(req: NextRequest): Promise<string | null> {
|
|
try {
|
|
// Clerk's auth() should handle both cookies and Bearer tokens automatically
|
|
// when the request is properly formatted
|
|
const { userId } = await auth();
|
|
|
|
if (userId) {
|
|
log.debug("Authenticated user", { userId });
|
|
return userId;
|
|
}
|
|
|
|
log.debug("No authentication found");
|
|
|
|
// Log headers for debugging
|
|
const authHeader = req.headers.get("authorization");
|
|
log.debug("Authorization header check", {
|
|
present: !!authHeader,
|
|
});
|
|
|
|
return null;
|
|
} catch (error) {
|
|
log.error("Authentication error", error);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Simplified version that just uses Clerk's built-in auth
|
|
* This should work with both session cookies and Bearer tokens
|
|
*/
|
|
export async function requireAuth(req: NextRequest): Promise<string> {
|
|
const userId = await getAuthUserId(req);
|
|
|
|
if (!userId) {
|
|
throw new Error("Unauthorized");
|
|
}
|
|
|
|
return userId;
|
|
}
|