🔑
Vercel にデプロイした docsify に middleware を使って BASIC 認証をかける
こちらの記事に大感謝!
docsify への導入には少しアレンジが必要だったので備忘録です。
コード
middleware.js
const next = () => {
const headers = new Headers();
headers.set("x-middleware-next", "1");
return new Response(null, {
headers,
});
};
export const config = {
matcher: "/",
};
const USER_NAME = process.env.BASIC_AUTH_USER || "admin";
const PASSWORD = process.env.BASIC_AUTH_PASSWORD || "admin";
export default function middleware(request) {
const authorizationHeader = request.headers.get("authorization");
if (authorizationHeader) {
const basicAuth = authorizationHeader.split(" ")[1];
const [user, password] = atob(basicAuth).toString().split(":");
if (user === USER_NAME && password === PASSWORD) {
return next();
}
}
return new Response("Basic Auth required", {
status: 401,
headers: {
"WWW-Authenticate": 'Basic realm="Secure Area"',
},
});
}
基本的に上記の記事で紹介されているコードと同じですが、1箇所だけ変更します。
- import { next } from "@vercel/edge";
+ const next = () => {
+ const headers = new Headers();
+ headers.set("x-middleware-next", "1");
+ return new Response(null, {
+ headers,
+ });
+ };
初期化コマンドの docsify init ./docs
はディレクトリ( docs
)を作成してその中に .nojekyll
や index.html
を作成するだけなので、 node_modules
ディレクトリは作られません。
その状態で import { next } from "@vercel/edge";
としても読み込み先が存在しなくてエラーになってしまうので、代わりに読み込み先のコードを直に書き込んでやります(引数 init を受け取ることはないので大元のコードをさらに簡略化)。
書いた middleware.js
は docs
ディレクトリの直下に入れましょう。
Vercel へのデプロイ上での各種設定
デプロイの Root Directory は docs
を設定。
Vercel の設定画面から BASIC_AUTH_USER
と BASIC_AUTH_PASSWORD
の環境変数を設定しておきます。
ここまでの設定がうまくいっていれば BASIC 認証が有効になります。
Discussion
npm install @vercel/edge
という操作はvercel cli
をローカル環境にインストールした後、ローカル環境で実行すればいいのでしょうか?docsifyに認証をかけるだけであれば、元記事に書いてある
npm install @vercel/edge
を実行する必要もありません(この記述が本文にありませんでしたね)。docs
フォルダの中にmiddleware.js
を配置してvercelにデプロイするだけでOKですよ!これは、vercelの公式リポジトリにあるソースコードから必要な部分をコピペしてきているだけです↓
ありがとうございます!すこしは、Vercelに慣れ親しんでおこうと、アカウント取得および非認証サイト作り:やってみました。GITリポジトリにSSGでつくったhtmlたちがあれば、正常にデプロイできることだけ確認しました。おっしゃるとおりにmiddleware.jsおいたら認証できました。