feat(WEB-132): add middlewares, support for seamless login and improve lang based routes
This commit is contained in:
53
middlewares/authRequired.ts
Normal file
53
middlewares/authRequired.ts
Normal file
@@ -0,0 +1,53 @@
|
||||
import { NextResponse } from "next/server"
|
||||
|
||||
import { auth } from "@/auth"
|
||||
import { findLang } from "@/constants/languages"
|
||||
import { authRequired } from "@/constants/routes/authRequired"
|
||||
import { login } from "@/constants/routes/handleAuth"
|
||||
|
||||
import type { NextMiddleware } from "next/server"
|
||||
|
||||
import type { MiddlewareMatcher } from "@/types/middleware"
|
||||
|
||||
/**
|
||||
* AppRouteHandlerFnContext is the context that is passed to the handler as
|
||||
* the second argument. This is only done for Route handlers (route.js) and
|
||||
* not for middleware. Middleware`s second argument is `event` of type
|
||||
* `NextFetchEvent`.
|
||||
*
|
||||
* Auth.js uses the same pattern for both Route handlers and Middleware,
|
||||
* the auth()-wrapper:
|
||||
*
|
||||
* auth((req) => { ... })
|
||||
*
|
||||
* But there is a difference between middleware and route handlers, route
|
||||
* handlers get passed a context which middleware do not get (they get a
|
||||
* NextFetchEvent instead). Using the same function for both works runtime
|
||||
* because Auth.js handles this properly. But fails in typings as the second
|
||||
* argument doesn't match for middleware.
|
||||
*
|
||||
* We want to avoid using ts-expect-error because that hides other errors
|
||||
* not related to this typing error and ts-expect-error cannot be scoped either.
|
||||
*
|
||||
* So we type assert this export to NextMiddleware. The lesser of all evils.
|
||||
*
|
||||
* https://github.com/nextauthjs/next-auth/blob/3c035ec62f2f21d7cab65504ba83fb1a9a13be01/packages/next-auth/src/lib/index.ts#L265
|
||||
* https://authjs.dev/reference/nextjs
|
||||
*/
|
||||
export const middleware = auth(async (request) => {
|
||||
const { nextUrl } = request
|
||||
const lang = findLang(nextUrl.pathname)!
|
||||
|
||||
const isLoggedIn = !!request.auth
|
||||
|
||||
if (isLoggedIn) {
|
||||
return NextResponse.next()
|
||||
}
|
||||
|
||||
const loginUrl = login[lang]
|
||||
return NextResponse.redirect(new URL(loginUrl, request.nextUrl))
|
||||
}) as NextMiddleware // See comment above
|
||||
|
||||
export const matcher: MiddlewareMatcher = (request) => {
|
||||
return authRequired.includes(request.nextUrl.pathname)
|
||||
}
|
||||
Reference in New Issue
Block a user