ロゴテキスト ロゴ

    Next.js13でBasic認証を導入(App Router対応)

    Next.js13でBasic認証を導入(App Router対応)

    Next.jsは順調にバージョンが上がり、middleware.tsも使い方が少しずつ変わっています。



    以前にmiddleware.tsを使ったBasic認証の記事を書きましたが最新の13系のバージョンでは動きません 😅


    この記事ではNext.js13.4より安定版となったApp Routerを用いつつ
    Basic認証をmiddleware.tsを使って手軽に設定
    していきます!


    検証した環境

    1 node 18.18.0
    2 next 13.5.4

    初期セットアップ

    nodeは2023/10/10時点のLTS 18.18.0 を使用

    .node-version
    18.18.0


    npx create-next-app@latest を使ってNext.jsのアプリケーションを作成していきます

    # npmを使ってNext.jsのアプリケーションを作成
    # yarnを用いたい場合は yarn create next-app になる
    $ npx create-next-app@latest
     
    Need to install the following packages:
    create-next-app@13.5.4
    Ok to proceed? (y)
     What is your project named?  my-app
     Would you like to use TypeScript?  Yes
     Would you like to use ESLint?  Yes
     Would you like to use Tailwind CSS?  Yes
     Would you like to use `src/` directory?  Yes
     Would you like to use App Router? (recommended) … Yes
     Would you like to customize the default import alias (@/*)? … No
    Creating a new Next.js app in /Users/yuu/src/github.com/yuki-takara/app-router-basic-auth-sample/my-app.
     
    Using npm.


    「my-app」というフォルダを↑で作成したものの

    ルートフォルダ内に展開したかったため「my-app」の中身を全てルートフォルダに移動


    結果ルートフォルダ内は以下のようになりました。

    $ tree -L 2
    .
    ├── README.md
    ├── next-env.d.ts
    ├── next.config.js
    ├── node_modules
    │   ├── @aashutoshrathi
    │   ├── @alloc
    ・・・
    ├── package-lock.json
    ├── package.json
    ├── postcss.config.js
    ├── public
    │   ├── next.svg
    │   └── vercel.svg
    ├── src
    │   └── app
    ├── tailwind.config.ts
    └── tsconfig.json


    dev環境を起動してみます

    npm run dev
     
    > my-app@0.1.0 dev
    > next dev
     
       Next.js 13.5.4
      - Local:        http://localhost:3000
     
      Ready in 3.4s
    Next.jsのプロジェクトを起動出来るようになった

    無事起動出来るようになりました!🎉

    Basic認証の設定

    ローカル環境

    設定をするファイルは

    • .env
    • middleware.ts

    の2つです!

    .envはルートフォルダ直下に、middlewareはsrc/に追加します。

    ./.env
    ENABLE_BASIC_AUTH=true
    BASIC_AUTH_USERNAME=username
    BASIC_AUTH_PASSWORD=password

    ./src/middleware.ts
    import { NextRequest, NextResponse } from 'next/server'
     
    const isAuthenticated = (request: NextRequest) => {
      if (process.env.ENABLE_BASIC_AUTH !== 'true') return true;
     
      const authHeader = request.headers.get('authorization') || request.headers.get('Authorization');
      if (!authHeader) return false;
     
      const auth = Buffer.from(authHeader.split(' ')[1], 'base64').toString().split(':');
      const user = auth[0];
      const pass = auth[1];
     
      return user === process.env.BASIC_AUTH_USERNAME && pass === process.env.BASIC_AUTH_PASSWORD;
    }
     
    export function middleware(request: NextRequest) {
      if (!isAuthenticated(request)) {
        return new NextResponse('Authentication required', {
          status: 401,
          headers: { 'WWW-Authenticate': 'Basic' },
        });
      }
     
      return NextResponse.next();
    }

    ここまででdev環境を起動すると

    Basic認証が設定されます!


    Vercel

    ↑のmiddlewareのコードがVercelにも反映されている前提で

    あとは環境変数に設定すればよいので

    • Vercelプロジェクトページ > Settings > Environment Variables

    より、3つの値を設定します

    • ENABLE_BASIC_AUTH・・trueの場合Basic認証が有効になる
    • BASIC_AUTH_USERNAME・・Basic認証のユーザー名
    • BASIC_AUTH_PASSWORD・・Basic認証のパスワード
    VercelでBasic認証に必要な環境変数を設定する


    ENABLE_BASIC_AUTHを調整することでProduction以外ではBasic認証を有効にする、といったことが簡単に実現出来ます

    Production環境ではBasic認証を無効にする例
    プロフィールの背景画像 プロフィール画像
    Yuki Takara
    都内でフリーランスのエンジニアをやってます。フロントとアプリ開発メインに幅広くやってます。