我想在ExpressJS上设置具有唯一随机字符串路径的临时路由。这些路由应该是动态创建的,如果有人在创建uniqueid后30分钟尝试使用ie http://example.com/login/a434bcd34d920bdfe,则应该给出404。
关于如何做到这一点的任何想法?我对NodeJS很陌生,但从我所看到的情况来看,应该有一个库可以做到这一点:) 这样的事可能吗?
// =========== app.js ============
app.get('/generate_url', function(req, res) {
// random string: "a434bcd34d920bdfe"
var extension = randomstring.generate();
var dynamicController = require('./login/'+extension);
dynamicController.init(app);
// Should expire in 20 minutes
dynamicController.expire(20*60)
res.status(200).send();
}
// =========== login.js ============
login.post('/login/:uniqueid', function(req, res) {
// uniqueid should match the extension generated before
var uniqueid = req.query.unique;
var username = req.body.username;
// Do something with this info
}
我认为这远远不能正常工作,但至少可能是某人完成了
答案 0 :(得分:1)
您必须创建一个接收来自所有用户的流量的路由,并检查特定URL是否有效。
首先,您创建一条获取所有用户流量的路由。
app.get('/myroute/:id',function(){
/* This route will get any url that start with /myroute/
For example /myroute/abc
/myroute/def
*/
// req.params.id == what the URL is entered
if (is_expired(req.params.id)) return res.end('Sorry your link has expired')
res.send('Great you logged in!')
})
app.post('/login/:uniqueid', function(req, res) {
set_expire(req.params.uniquieid,30*1000*60) //30 minutes = 30*60*1000 miliseconds.
})
如何实施set_expire
和is_expired
您需要实现使用任何类型的数据库。 Redis
非常有用。我将向您展示如何做到这一点
使用setTimeout
。它会工作。但是如果服务器重启,所有用户都将被注销。
users={}
function is_expired(uid){
return users[uid]
}
function set_expire(uid,time){
users[uid]=true
setTimeout(function(){
delete users[uid]
},time)
}
答案 1 :(得分:0)
通常这是通过通用路由器处理程序完成的,然后查询某些数据存储以查看请求中发送的ID是否有效。
另请注意,来自'/login/:uniqueid'
等路线规范的值可在req.params.uniqueid
中找到,而不是req.query.uniqueid
。 req.query
用于实际查询参数(URL中?
之后的内容)。
var validIds = {};
// =========== app.js ============
app.get('/generate_url', function(req, res) {
// generate random string: "a434bcd34d920bdfe"
// make sure it's not already in use
var extension;
do {
extension = randomstring.generate();
} while (validIds[extension]);
// save this random string as a valid ID and store the expiration time
validIds[extension] = {expiration: Date.now() + 20 * 60 * 1000};
// return the random value to the caller
res.json(extension);
}
app.post('/login/:uniqueid', function(req, res) {
// uniqueid should match the extension generated before
var uniqueid = req.params.unique;
var username = req.body.username;
// now see if the id is still valid
var idInfo = validIds[uniqueid];
if (!idInfo || idInfo.expiration < Date.now()) {
return res.sendStatus(404);
}
// id is valid, do something with this info
}
然后,您可以使用一些间隔计时器来定期清理任何过期的ID。这只是用于保持validIds对象不会永远增长的内务处理 - 在验证id之前仍会检查实际的到期值。
// clean up expired validIds object every 10 minutes
setInterval(function() {
var now = Date.now();
for (var id in validIds) {
if (validIds[id].expiration < now) {
delete validIds[id];
}
}
}, 10 * 60 * 1000);
注意:由于您可能希望您的uniqueID在服务器重新启动后继续存在,因此您需要定期将它们保存到某种后备存储(数据库,平面文件等),然后您需要在其中读取该数据服务器启动。
如果您想要任何类型的用户活动,请&#34;续订&#34;对于uniqueid的超时,您可以安装一些中间件,以便在适当的访问时重置时间。