From 6709472026140d9dd0d22ac57adb3dada84b75af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Thu, 14 Jul 2022 01:16:09 +0200 Subject: [PATCH 1/4] fix(ts): improve Middleware types --- apps/dev/middleware.ts | 3 +-- packages/next-auth/src/next/middleware.ts | 29 ++++++++++++++++------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/apps/dev/middleware.ts b/apps/dev/middleware.ts index f5e014d34b..e55e15e9d7 100644 --- a/apps/dev/middleware.ts +++ b/apps/dev/middleware.ts @@ -30,12 +30,11 @@ export const config = { matcher: ["/middleware-protected"] } // export default withAuth( // function middleware(req, ev) { // console.log(req, ev) -// return undefined // NOTE: `NextMiddleware` should allow returning `void` // }, // { // callbacks: { // authorized: ({ token }) => token.name === "Balázs Orbán", -// } +// }, // } // ) diff --git a/packages/next-auth/src/next/middleware.ts b/packages/next-auth/src/next/middleware.ts index 97c5160173..2638b46db8 100644 --- a/packages/next-auth/src/next/middleware.ts +++ b/packages/next-auth/src/next/middleware.ts @@ -92,7 +92,9 @@ export interface NextAuthMiddlewareOptions { secret?: string } -type NextMiddlewareResult = ReturnType +// TODO: `NextMiddleware` should allow returning `void` +// Simplify when https://github.com/vercel/next.js/pull/38625 is merged. +type NextMiddlewareResult = ReturnType | void async function handleMiddleware( req: NextRequest, @@ -145,12 +147,21 @@ async function handleMiddleware( return NextResponse.redirect(signInUrl) } +export interface NextRequestWithAuth extends NextRequest { + nextauth: { token: JWT | null } +} + +export type NextMiddlewareWithAuth = ( + request: NextRequestWithAuth, + event: NextFetchEvent +) => NextMiddlewareResult | Promise + export type WithAuthArgs = - | [NextRequest] - | [NextRequest, NextFetchEvent] - | [NextRequest, NextAuthMiddlewareOptions] - | [NextMiddleware] - | [NextMiddleware, NextAuthMiddlewareOptions] + | [NextRequestWithAuth] + | [NextRequestWithAuth, NextFetchEvent] + | [NextRequestWithAuth, NextAuthMiddlewareOptions] + | [NextMiddlewareWithAuth] + | [NextMiddlewareWithAuth, NextAuthMiddlewareOptions] | [NextAuthMiddlewareOptions] | [] @@ -180,8 +191,10 @@ export function withAuth(...args: WithAuthArgs) { const options = args[1] as NextAuthMiddlewareOptions | undefined return async (...args: Parameters) => await handleMiddleware(args[0], options, async (token) => { - ;(args[0] as any).nextauth = { token } - return await middleware(...args) + const [req, ...rest] = args + // @ts-expect-error + req.nextauth = { token } + return await middleware(req as NextRequestWithAuth, ...rest) }) } From 5971806ad6f72721b4c7b10cfdc25d8bbf9f3d27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Thu, 14 Jul 2022 01:16:21 +0200 Subject: [PATCH 2/4] docs: remove TS workaround for Middleware --- docs/docs/configuration/nextjs.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/docs/configuration/nextjs.md b/docs/docs/configuration/nextjs.md index e7270ced92..a04d04c324 100644 --- a/docs/docs/configuration/nextjs.md +++ b/docs/docs/configuration/nextjs.md @@ -177,13 +177,11 @@ If you do not define the options, NextAuth.js will use the default values for th #### wrap middleware ```ts title="middleware.ts" -import type { NextRequest } from "next/server" -import type { JWT } from "next-auth/jwt" import { withAuth } from "next-auth/middleware" export default withAuth( - // `withAuth` can augment your Request with the user's token. - function middleware(req: NextRequest & { nextauth: { token: JWT | null } }) { + // `withAuth` augments your `Request` with the user's token. + function middleware(req) { console.log(req.nextauth.token) }, { From 6847390454232ed790400b21d8b8d7569d2b9679 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Thu, 14 Jul 2022 01:25:16 +0200 Subject: [PATCH 3/4] ignore lint --- packages/next-auth/src/next/middleware.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next-auth/src/next/middleware.ts b/packages/next-auth/src/next/middleware.ts index 2638b46db8..6c7f4212a4 100644 --- a/packages/next-auth/src/next/middleware.ts +++ b/packages/next-auth/src/next/middleware.ts @@ -94,7 +94,7 @@ export interface NextAuthMiddlewareOptions { // TODO: `NextMiddleware` should allow returning `void` // Simplify when https://github.com/vercel/next.js/pull/38625 is merged. -type NextMiddlewareResult = ReturnType | void +type NextMiddlewareResult = ReturnType | void // eslint-disable-line @typescript-eslint/no-invalid-void-type async function handleMiddleware( req: NextRequest, From 42367e26e343b5759be10a6caa4ab093632a4597 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Fri, 15 Jul 2022 01:16:47 +0200 Subject: [PATCH 4/4] simplify --- packages/next-auth/src/next/middleware.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/next-auth/src/next/middleware.ts b/packages/next-auth/src/next/middleware.ts index 6c7f4212a4..c230d8240e 100644 --- a/packages/next-auth/src/next/middleware.ts +++ b/packages/next-auth/src/next/middleware.ts @@ -189,12 +189,10 @@ export function withAuth(...args: WithAuthArgs) { if (typeof args[0] === "function") { const middleware = args[0] const options = args[1] as NextAuthMiddlewareOptions | undefined - return async (...args: Parameters) => + return async (...args: Parameters) => await handleMiddleware(args[0], options, async (token) => { - const [req, ...rest] = args - // @ts-expect-error - req.nextauth = { token } - return await middleware(req as NextRequestWithAuth, ...rest) + args[0].nextauth = { token } + return await middleware(...args) }) }