如何使请求中的授权 header 过期?

How to expire Authorization header in request?

我试图理解和实现基本身份验证算法,并且 looks like it works as expected。现在我遇到了一个问题:请求中的 Authorization header 永不过期(至少,现在已经有几天了),所以客户端总是看到受保护的内容,而我想要他们每分钟 re-authenticate。

根据 this answer 判断,问题在于浏览器基本上就是这样工作的——为了方便起见,它们会记住用户凭据。唉,答案没有提供任何解决方案,只有解释,我真的很想不依赖客户端浏览器设置。

我可以在服务器上添加什么,以便请求中的 Authorization header 一旦创建,将在 1 分钟后过期,并且不包含在请求中1 分钟后发送?


我正在为服务器使用 express 库,为 cookie 使用 express-session(请参阅下面的实际身份验证中间件代码)。 cookie 设置为 Max-Age 60 秒:

app.use(session({
    secret: process.env.EXPRESS_SESSION_SECRET,
    resave: false,
    saveUninitialized: false,
    cookie: {
        maxAge: 60_000,
    },
}));

GET /private 请求需要正确的 Authorization header 才能到达内容。以下方法的问题在于,虽然 req.session.authenticated 在 1 分钟后变为 undefined(cookie session 已过期),但 req.get("Authorization") 仍然存在(null、也不是 undefined),并且是正确的,因此服务器会自动再次对客户端进行身份验证:

app.route("/private").get(
    (req, res, next) => {
        if (!req.session.authenticated) {
            const authorization = req.get("Authorization");

            if (authorization == null)
                return authenticate(res); // see function definition below

            const [ , credentialsRaw ] = authorization.split(" ");
            const [ username, password ] = Buffer.from(credentialsRaw, "base64").toString("ascii").split(":");

            if (username in users === false)
                return authenticate(res);

            if (password !== users[username].password) // I didn't bother with security
                return authenticate(res);

            req.session.authenticated = true;
        }

        next();
    },
    (req, res) => {
        res.send(`<h1>Congratulations! You've accessed the private page! </h1>`);
    },
);
function authenticate(res) {
    res.setHeader("WWW-Authenticate", `Basic realm="Access to the staging site"`);
    res.status(401).send(`<h1>Unauthorized !</h1>`)
}

因此,看起来 HTTP 基本身份验证不包括注销或使凭据过期。

如果有人想要我的意见,那真是太可惜了。