Closed1

[小ネタ] oakでBasic認証する

shuntakashuntaka

はじめに

DenoにはoakというHTTP Serverのライブラリがあります。サクッとWebアプリをBasic認証付きで公開したい場合に便利です。DenoだとDeno Deployがあるのでホスティング簡単です。

実装

コード

src/server.ts
import { Application, Context } from "https://deno.land/x/oak@v12.6.1/mod.ts";

const app = new Application();

const checkCredentials = (ctx: Context) => {
  const authHeader = ctx.request.headers.get("Authorization");
  if (!authHeader) return false;

  const encoded = authHeader.replace(/^Basic /, "");
  const decoded = atob(encoded);
  const [username, password] = decoded.split(":");

  return username === "<ユーザー名>" && password === "<パスワード>";
};

const authMiddleware = async (ctx: Context, next: () => Promise<unknown>) => {
  if (checkCredentials(ctx)) {
    await next();
  } else {
    ctx.response.status = 401;
  }
};

app.use(authMiddleware);

app.use(async (context, next) => {
  try {
    await context.send({
      root: `${Deno.cwd()}/dist`,
      index: "index.html",
    });
  } catch {
    await next();
  }
});

await app.listen({ port: 8000 });

デプロイコマンド

以下の前提があります。

  • srcにはソース内容
  • distにはホスティングしたいソースコード
deployctl deploy
  --project=<プロジェクト名> \
  --entrypoint=./src/server.ts \
  --include=./src \
  --include=./dist \
  --prod
このスクラップは2024/01/09にクローズされました