@@ -4,13 +4,7 @@ import { verifyToken } from "@clerk/backend";
44import { db , users , folders , type User } from "../db" ;
55import { eq } from "drizzle-orm" ;
66import { logger } from "../lib/logger" ;
7- import type {
8- ClerkUserData ,
9- ClerkJWTPayload ,
10- UserUpdateData ,
11- ClerkApiUser ,
12- DatabaseError ,
13- } from "../types" ;
7+ import type { ClerkUserData , ClerkJWTPayload , UserUpdateData , DatabaseError } from "../types" ;
148
159if ( ! process . env . CLERK_SECRET_KEY ) {
1610 throw new Error (
@@ -27,6 +21,7 @@ declare module "hono" {
2721}
2822
2923const extractAndVerifyClerkToken = async ( c : Context ) : Promise < ClerkUserData | null > => {
24+ const startTime = Date . now ( ) ;
3025 const authHeader = c . req . header ( "Authorization" ) ;
3126
3227 if ( ! authHeader || ! authHeader . startsWith ( "Bearer " ) ) {
@@ -36,48 +31,29 @@ const extractAndVerifyClerkToken = async (c: Context): Promise<ClerkUserData | n
3631 const token = authHeader . split ( " " ) [ 1 ] ;
3732
3833 try {
34+ const verifyStart = Date . now ( ) ;
3935 const payload = ( await verifyToken ( token , {
4036 secretKey : process . env . CLERK_SECRET_KEY ! ,
4137 } ) ) as unknown as ClerkJWTPayload ;
42-
43- try {
44- const userResponse = await fetch ( `https://api.clerk.com/v1/users/${ payload . sub } ` , {
45- headers : {
46- Authorization : `Bearer ${ process . env . CLERK_SECRET_KEY } ` ,
47- "Content-Type" : "application/json" ,
48- } ,
49- } ) ;
50-
51- if ( userResponse . ok ) {
52- const clerkUser : ClerkApiUser = await userResponse . json ( ) ;
53- return {
54- id : clerkUser . id ,
55- email : clerkUser . email_addresses ?. [ 0 ] ?. email_address || "" ,
56- firstName : clerkUser . first_name || null ,
57- lastName : clerkUser . last_name || null ,
58- } ;
59- } else {
60- return {
61- id : payload . sub ,
62- email : "" ,
63- firstName : null ,
64- lastName : null ,
65- } ;
66- }
67- } catch {
68- return {
69- id : payload . sub ,
70- email : "" ,
71- firstName : null ,
72- lastName : null ,
73- } ;
74- }
38+ console . log ( `[AUTH PERF] verifyToken took: ${ Date . now ( ) - verifyStart } ms` ) ;
39+
40+ // Security is maintained by JWT verification above
41+ // User metadata comes from our DB (updated via webhooks or on login)
42+ // No need to call Clerk API on every request - saves 150-200ms
43+ console . log ( `[AUTH PERF] Total extractAndVerify took: ${ Date . now ( ) - startTime } ms` ) ;
44+ return {
45+ id : payload . sub ,
46+ email : "" , // Will be populated from DB
47+ firstName : null , // Will be populated from DB
48+ lastName : null , // Will be populated from DB
49+ } ;
7550 } catch {
7651 return null ;
7752 }
7853} ;
7954
8055export const authMiddleware = async ( c : Context , next : Next ) => {
56+ const middlewareStart = Date . now ( ) ;
8157 const userData = await extractAndVerifyClerkToken ( c ) ;
8258
8359 if ( ! userData ) {
@@ -86,9 +62,11 @@ export const authMiddleware = async (c: Context, next: Next) => {
8662 } ) ;
8763 }
8864
65+ const dbQueryStart = Date . now ( ) ;
8966 let existingUser = await db . query . users . findFirst ( {
9067 where : eq ( users . id , userData . id ) ,
9168 } ) ;
69+ console . log ( `[AUTH PERF] DB user lookup took: ${ Date . now ( ) - dbQueryStart } ms` ) ;
9270
9371 if ( existingUser ) {
9472 try {
@@ -170,6 +148,8 @@ export const authMiddleware = async (c: Context, next: Next) => {
170148 c . set ( "user" , existingUser ) ;
171149 c . set ( "clerkUser" , userData ) ;
172150
151+ console . log ( `[AUTH PERF] Total auth middleware took: ${ Date . now ( ) - middlewareStart } ms` ) ;
152+
173153 // User context available in Hono context
174154
175155 await next ( ) ;
0 commit comments