如何使请求中的授权 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 基本身份验证不包括注销或使凭据过期。
如果有人想要我的意见,那真是太可惜了。
我试图理解和实现基本身份验证算法,并且 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 基本身份验证不包括注销或使凭据过期。
如果有人想要我的意见,那真是太可惜了。