Closed2

RemixでBASIC認証を使う

Hi MORISHIGEHi MORISHIGE

RemixでBASIC認証を使うときのメモ
各ページで手軽に利用できるのがよい感じ。

app/route/index.tsx
import { HeadersFunction, json, LoaderFunction, useLoaderData } from "remix";

export const headers: HeadersFunction = () => ({
  "WWW-Authenticate": "Basic",
});

const isAuthorized = (request: Request) => {
  const header = request.headers.get("Authorization");

  if (!header) return false;

  const base64 = header.replace("Basic ", "");
  const [username, password] = Buffer.from(base64, "base64")
    .toString()
    .split(":");

  // 環境変数などでIDとパスワードを渡す
  return username === "admin" && password === "password";
};

export const loader: LoaderFunction = async ({ request }) => {
  if (!isAuthorized(request)) {
    return json({ authorized: false }, { status: 401 });
  }

  // 認証されたページで利用するデータ

  return json({
    authorized: true,
    // 認証されたページで利用するデータを送る
  });
};

export default function Download() {
  const data = useLoaderData();

  if (!data.authorized) {
    return <p>Unauthorized</p>;
  }

  return <div>Authorized</div>;
}
Hi MORISHIGEHi MORISHIGE

変数をBASIC認証に割り当てることもできるのでLoaderData内で動的にやりくりしたものを使えるのも面白いところ。

const isAuthorized = (
  request: Request,
+  auth: { username: string; password: string }
) => {
  const header = request.headers.get("Authorization");

  if (!header) return false;

  const base64 = header.replace("Basic ", "");
  const [username, password] = Buffer.from(base64, "base64")
    .toString()
    .split(":");

  // 環境変数などでIDとパスワードを渡す
+  return username === auth.username && password === auth.password;
};

export const loader: LoaderFunction = async ({ request }) => {
+  if (!isAuthorized(request, { username: "hoge", password: "fuga" })) {
    return json({ authorized: false }, { status: 401 });
  }

  // 認証されたページで利用するデータ

  return json({
    authorized: true,
    // 認証されたページで利用するデータを送る
  });
};
このスクラップは2022/04/02にクローズされました