◆ ダイアログ出さずレスポンスコードも 401 以外にして認証必要ページと気づかせない
◆ だけど URL に認証情報入れてるとログインできる
◆ curl は普通にできる
◆ ブラウザは無理
  ◆ 401 と WWW-Authenticate レスポンス受け取らないと認証情報を送らない
  ◆ URL に認証情報が含まれてても一度認証情報なしでリクエストして必要なら再リクエスト時に送信

普通の Basic 認証

普通の Basic 認証だとサーバはこんなのです

const http = require("http")

const realm = "xyz"
const basic_user = "abcd"
const basic_pass = "123"

http.createServer((req, res) => {
if (!req.url.startsWith("/auth")) {
res.end("ok")
return
}

const auth = req.headers.authorization
if (auth) {
const str = Buffer.from(auth.split(" ")[1], "base64").toString()
const [user, pass] = str.split(":")

if (basic_user === user && basic_pass === pass) {
res.statusCode = 200
res.end("authorized")
} else {
res.statusCode = 401
res.setHeader("WWW-Authenticate", `Basic realm="${realm}"`)
res.end("Unauthorized")
}
} else {
res.statusCode = 401
res.setHeader("WWW-Authenticate", `Basic realm="${realm}"`)
res.end("Unauthorized")
}
}).listen(8001)

アクセスすると最初は auth が空なので一番下の else に行って 401 と WWW-Authenticate レスポンスが返ります
このレスポンスを受けるとブラウザは Basic 認証必要だからユーザ名とパスワード入れてねーってダイアログを出してきます

秘密にしたい

このダイアログを出さず ここが Basic 認証が必要なページであるってことを知らない人には気づかせずに Basic 認証したいです
ダイアログを使わなくても URL に 「http://user:pass@example.com/foo/bar」 みたいなものを入れるとユーザ名とパスワードを送ることができます
これを使って 知ってる人は認証情報を含んだ URL を開くことで認証できて 知らない人はダイアログが出ないので Basic 認証が存在することすらわからない というのをやりたいです

ただ 簡単にできそうと思ってたのですが ブラウザだと無理そうでした

curl ならできる

まず curl を使ったものですが 単純に 401 のところを 403 などにするだけでおっけいでした

curl http://abcd:123@localhost:8001/auth

これで authorized が返ってきます

認証情報なしやパスワードが間違ってたら 403 エラーになって Basic 認証が必要か分かりませんし 404 とか 503 とかを代わりに出しておけば Basic 認証しようとも思わないでしょう

ブラウザの場合は

ブラウザの場合は URL に認証情報を入れてもサーバ側に届きません
通常の Basic 認証のダイアログが出る状態で 認証情報ありの URL でアクセスしてみると 一度 auth なしのリクエストが来て その後 auth ありのリクエストが来ています
URL に認証情報を入れても 入れないのと同じで 認証情報なしのリクエストを行い 認証必要となれば再リクエストのようです
そのときにダイアログを出さないくらいの違いです

そのため 401 かつ WWW-Authenticate のレスポンスを返さないと認証情報は送られず認証できません
セキュリティのためか知らないですが 認証情報を URL に入れてるなら 401 を確認しないでも送ってくれれば良いのですけどね

ブラウザは Chrome と Firefox が上に書いた動きで IE はそもそも認証情報あり URL を扱えませんでした
URL を入力したタイミングで構文エラーみたいな感じのエラーダイアログが出てきます