Basic Auth with Next.JS Middleware

Configure Basic Auth in NextJS using Middleware. Straight forward and easy to use.

next.js Routing Middleware

This blog post is part of a series of tech related content. We cover technical concepts, solutions and practical helpers that came out of our daily work.

Recently I had to secure a staging environment of a NextJS application we host on Vercel. In our Drupal development, we usually use Basic Auth features of Apache webserver or with the Shield module. Adding Basic Auth to a NextJS application is not that straight forward, especially when you pregenerate pages with getStaticProps(). Thanks to NextJS Middleware capabilities, there is a simple solution.

The following approach is taken from Vercels official examples GitHub.

Create middleware.ts in the root of your NextJS app.

// middleware.ts import { NextResponse } from 'next/server' import type { NextRequest } from 'next/server' export function middleware(req: NextRequest) {  // Basic Auth example taken from https://github.com/vercel/examples/tree/main/edge-functions/basic-auth-password  const basicAuth = req.headers.get('authorization')  const url = req.nextUrl  if (basicAuth) {    const authValue = basicAuth.split(' ')[1]    const [user, pwd] = atob(authValue).split(':')    if (user === 'username' && pwd === 'password') {      return NextResponse.next()    }  }  url.pathname = '/api/basicauth'  return NextResponse.rewrite(url) } export const config = {  matcher: '/:path*',

Create /pages/api/basicauth.ts

import type { NextApiRequest, NextApiResponse } from 'next' export default function handler(_: NextApiRequest, res: NextApiResponse) {  res.setHeader('WWW-authenticate', 'Basic realm="Secure Area"')  res.statusCode = 401  res.end(`Auth Required.`) }

That will do the job. Change the username and password according to your needs.

Haben Sie Fragen zu diesem Thema?

Ich freue mich auf Ihre Kontaktaufnahme und berate Sie gerne persönlich.

Kontakt aufnehmen
13. Oktober 2022

Newsletter abonnieren.