◆ 連続ですべてのステップに成功したらログインできる

前記事で Basic 認証 と Cookie を組み合わせていて Cookie 組み合わせれば Basic 認証にステップが作れるじゃんと思いついたので試してみました
これが役に立つときはないと思います

もう少し詳しく書くと

1 回目は id: foo, pass: 1
2 回目は id: bar, pass: 2
3 回目は id: baz, pass: 3

のように順番に正しい id とパスワードを入れたときだけ成功するというものです
最後の id とパスワードだけあっていてもログインできません
途中で間違えると最初からやり直しです

後ろからこっそり見てる人がいて 最後にログインできたときのパスワードだけ覚えられても安心ですね?

コードはこんなのです

const http = require("http")

const realm = "xyz"
const steps = [
["foo", "1"],
["bar", "2"],
["baz", "3"],
]

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

if (req.url === "/auth/logout") {
res.statusCode = 401
res.end("logout")
return
}

const cookie = Object.fromEntries(
(req.headers.cookie || "").split(";").map((item) => item.split("="))
)

const nextAuth = (next_step) => {
res.statusCode = 401
res.setHeader("WWW-Authenticate", `Basic realm="${realm}"`)
res.setHeader("Set-Cookie", `step=${next_step}; path=/`)
res.end("Unauthorized")
}

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

const step = ~~cookie.step
const [basic_user, basic_pass] = steps[step]

if (basic_user === user && basic_pass === pass) {
if (steps[step + 1]) {
nextAuth(step + 1)
} else {
res.end("OK")
}
} else {
nextAuth(0)
}
} else {
nextAuth(0)
}
}).listen(8000)

/auth がログイン必要なページで /auth/logout を開くとログアウトできます
今が何番目のステップかを Cookie で保存しています