Skip to content

Commit e6fc58a

Browse files
authored
fix(nextjs,backend): Add debug logger to clerkMiddleware (clerk#3189)
1 parent fb794ce commit e6fc58a

4 files changed

Lines changed: 47 additions & 7 deletions

File tree

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
'@clerk/backend': patch
3+
'@clerk/nextjs': patch
4+
---
5+
6+
Introduce `debug: true` option for the `clerkMiddleware` helper
7+

packages/backend/src/tokens/__tests__/clerkRequest.test.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,5 +152,17 @@ export default (QUnit: QUnit) => {
152152
assert.equal(createClerkRequest(req).clerkUrl.toString(), 'https://example.com/path?foo=bar');
153153
});
154154
});
155+
156+
module('toJSON', () => {
157+
it('returns data as a JSON object', assert => {
158+
const req = createClerkRequest(new Request('http://localhost:3000'));
159+
const json = req.toJSON();
160+
assert.equal(json.url, 'http://localhost:3000/');
161+
assert.equal(json.method, 'GET');
162+
assert.equal(json.headers, '{}');
163+
assert.equal(json.clerkUrl, 'http://localhost:3000/');
164+
assert.equal(json.cookies, '{}');
165+
});
166+
});
155167
});
156168
};

packages/backend/src/tokens/clerkRequest.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { parse as parseCookies } from 'cookie';
22

33
import { constants } from '../constants';
4-
import type { ClerkUrl, WithClerkUrl } from './clerkUrl';
4+
import type { ClerkUrl } from './clerkUrl';
55
import { createClerkUrl } from './clerkUrl';
66

77
class ClerkRequest extends Request {
@@ -26,9 +26,15 @@ class ClerkRequest extends Request {
2626
this.cookies = this.parseCookies(this);
2727
}
2828

29-
public decorateWithClerkUrl = <R extends object>(req: R): WithClerkUrl<R> => {
30-
return Object.assign(req, { clerkUrl: this.clerkUrl });
31-
};
29+
public toJSON() {
30+
return {
31+
url: this.clerkUrl.href,
32+
method: this.method,
33+
headers: JSON.stringify(Object.fromEntries(this.headers)),
34+
clerkUrl: this.clerkUrl.toString(),
35+
cookies: JSON.stringify(Object.fromEntries(this.cookies)),
36+
};
37+
}
3238

3339
/**
3440
* Used to fix request.url using the x-forwarded-* headers

packages/nextjs/src/server/clerkMiddleware.ts

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import type { NextMiddleware } from 'next/server';
1111
import { NextResponse } from 'next/server';
1212

1313
import { isRedirect, serverRedirectWithAuth, setHeader } from '../utils';
14+
import { withLogger } from '../utils/debugLogger';
1415
import { clerkClient } from './clerkClient';
1516
import { PUBLISHABLE_KEY, SECRET_KEY, SIGN_IN_URL, SIGN_UP_URL } from './constants';
1617
import { errorThrower } from './errorThrower';
@@ -48,7 +49,7 @@ export type ClerkMiddlewareOptions = AuthenticateRequestOptions & { debug?: bool
4849

4950
/**
5051
* Middleware for Next.js that handles authentication and authorization with Clerk.
51-
* For more details, please refer to the docs: https://clerk.com/docs/references/nextjs/clerkMiddleware
52+
* For more details, please refer to the docs: https://beta.clerk.com/docs/references/nextjs/clerk-middleware
5253
*/
5354
interface ClerkMiddleware {
5455
/**
@@ -68,9 +69,13 @@ interface ClerkMiddleware {
6869
(request: NextMiddlewareRequestParam, event: NextMiddlewareEvtParam): NextMiddlewareReturn;
6970
}
7071

71-
export const clerkMiddleware: ClerkMiddleware = (...args: unknown[]): any => {
72+
export const clerkMiddleware: ClerkMiddleware = withLogger('clerkMiddleware', logger => (...args: unknown[]): any => {
7273
const [request, event] = parseRequestAndEvent(args);
7374
const [handler, params] = parseHandlerAndOptions(args);
75+
if (params.debug) {
76+
logger.enable();
77+
}
78+
7479
const publishableKey = assertKey(params.publishableKey || PUBLISHABLE_KEY, () =>
7580
errorThrower.throwMissingPublishableKeyError(),
7681
);
@@ -96,12 +101,20 @@ export const clerkMiddleware: ClerkMiddleware = (...args: unknown[]): any => {
96101

97102
const nextMiddleware: NextMiddleware = async (request, event) => {
98103
const clerkRequest = createClerkRequest(request);
104+
logger.debug('options', options);
105+
logger.debug('url', () => clerkRequest.toJSON());
99106

100107
const requestState = await clerkClient.authenticateRequest(
101108
clerkRequest,
102109
createAuthenticateRequestOptions(clerkRequest, options),
103110
);
104111

112+
logger.debug('requestState', () => ({
113+
status: requestState.status,
114+
headers: JSON.stringify(Object.fromEntries(requestState.headers)),
115+
reason: requestState.reason,
116+
}));
117+
105118
const locationHeader = requestState.headers.get(constants.Headers.Location);
106119
if (locationHeader) {
107120
return new Response(null, { status: 307, headers: requestState.headers });
@@ -110,6 +123,7 @@ export const clerkMiddleware: ClerkMiddleware = (...args: unknown[]): any => {
110123
}
111124

112125
const authObject = requestState.toAuth();
126+
logger.debug('auth', () => ({ auth: authObject, debug: authObject.debug() }));
113127

114128
const redirectToSignIn = createMiddlewareRedirectToSignIn(clerkRequest);
115129
const protect = createMiddlewareProtect(clerkRequest, authObject, redirectToSignIn);
@@ -123,6 +137,7 @@ export const clerkMiddleware: ClerkMiddleware = (...args: unknown[]): any => {
123137
}
124138

125139
if (isRedirect(handlerResult)) {
140+
logger.debug('handlerResult is redirect');
126141
return serverRedirectWithAuth(clerkRequest, handlerResult, options);
127142
}
128143

@@ -152,7 +167,7 @@ export const clerkMiddleware: ClerkMiddleware = (...args: unknown[]): any => {
152167
// Otherwise, return a middleware that can be called with a request and event
153168
// eg, export default clerkMiddleware(auth => { ... });
154169
return nextMiddleware;
155-
};
170+
});
156171

157172
const parseRequestAndEvent = (args: unknown[]) => {
158173
return [args[0] instanceof Request ? args[0] : undefined, args[0] instanceof Request ? args[1] : undefined] as [

0 commit comments

Comments
 (0)