飽き性の頭の中
Next.jsでベーシック認証を実装する方法のサムネイル

Next.jsでベーシック認証を実装する方法

2023-05-08に公開

IT技術メモ
# Next.js# TypeScript# ベーシック認証

主に次の記事を参照して、ベーシック認証の実装方法を紹介する。

Next.js で Basic 認証を設定する

Next.js 13:Basic 認証の実装方法とつまづいた点について

middleware.tsファイルをプロジェクトに追加すると、Next.js が自動的に認識して処理を行ってくれる。

middleware.ts
import { NextRequest, NextResponse } from "next/server";

export function middleware(req: NextRequest) {
  const basicAuth = req.headers.get("authorization");
  const url = req.nextUrl;

  const BASIC_USER = process.env.BASIC_USER;
  const BASIC_PASSWORD = process.env.BASIC_PASSWORD;

  if (!BASIC_USER || !BASIC_PASSWORD) {
    return NextResponse.next();
  }

  if (basicAuth) {
    const authValue = basicAuth.split(" ")[1];
    const [user, pwd] = Buffer.from(authValue, "base64").toString().split(":");

    if (user === BASIC_USER && pwd === BASIC_PASSWORD) {
      return NextResponse.next();
    }
  }
  url.pathname = "/api/auth";

  return NextResponse.rewrite(url);
}

参照先の記事から少し変更した点は以下の通り。

  • 環境変数BASIC_USERBASIC_PASSWORDが設定されていない場合は認証を適用しない
    • 認証を適用したい環境だけに環境変数を設定すればよい
    • 例えばローカル開発中など、認証が不要な場合は容易に無効化できる

認証が通らない場合、リクエストは/api/authにリダイレクトされ、そこで認証処理が行われる。

pages/api/auth.ts
import { NextApiRequest, NextApiResponse } from "next";

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

2023 05 08 22 20 43

Profile picture

たわ / tawachan

1994年生まれ(29歳)

大学院修士課程(政治学)(2021-2023)

Web開発(2017-)

関連記事

タグ一覧

# 福岡:39# 東京:20# 大学院:13# 移住:10# エナジードリンク:9# Google:8# ブロックチェーン:8# Mac:7# Webエンジニア:7# Apple:6# Firebase:6# Next.js:6# Sony:6# サントリー:6# Googleフォト:5# インドネシア:5# 埼玉:5# 英語:5# AWS:4# Canon:4# EOS 8000D:4# Kindle:4# TypeScript:4# ZONe:4# ラーメン:4# 京都:4# 仮想通貨:4# 社会人:4# 鴨川シーワールド:4# Docker:3# EOS8000D:3# Google Drive:3# Lightroom:3# Markdown:3# Pixel:3# React:3# React Native:3# a7iii:3# d.school:3# iPad:3# iPad mini:3# アマルティア・セン:3# アメリカ:3# コワーキングスペース:3# セブンイレブン:3# デザイン思考:3# レッドブル:3# ワークショップ:3# 卒業旅行:3# 寿司:3# 紅葉:3# 長崎:3# API:2# ChatGPT:2# ECR:2# ERC20:2# Expo.io:2# Firestore:2# GPT4:2# Gatsby.js:2# GitHub Actions:2# Kindle Oasis:2# Kindle Paperwhite:2# LINE:2# MacBook Pro:2# NestJS:2# Notion:2# Oculus:2# Oculus Quest:2# Pixel Buds:2# VS Code:2# Zotero:2# iPhone:2# pandoc:2# re:Invent:2# かき小屋:2# カフェ:2# ギグワーカー:2# サーチコンソール:2# ジャカルタ:2# スターバックス:2# ステーキ:2# スマートウォッチ:2# ソラマチ:2# チョコレート:2# ニューヨーク:2# バリ島:2# パンとエスプレッソと:2# ヒュッゲ:2# ビーチ:2# ブックスタンド:2# ブログ:2# マクドナルド:2# ミズマチ:2# モンスターエナジー:2# ワイヤレスイヤホン:2# 三千院:2# 両国:2# 修士論文:2# 兵庫:2# 千葉:2# 博多:2# 堀江貴文:2# 宮崎:2# 就活:2# 嵐山:2# 川越:2# 広島:2# 新宿御苑:2# 旅行:2# 日米学生会議:2# 有馬温泉:2# 東寺:2# 東浩紀:2# 機械学習:2# 歴史:2# 民主主義:2# 江ノ島:2# 清澄白河:2# 独自ドメイン:2# 神奈川:2# 神戸:2# 転職:2

©2023 tawachan All Rights Reserved.