我有一个基本的HTML登录页面,用户名和密码字段由javascript处理,输入的内容被送回我的Node API进行完整的AD认证。
我有4个更多的HTML网站,只有当用户通过认证后才能访问。在Node应用中运行的身份验证部分工作得很好,但是,我无法处理已经登录的用户的会话。我还想让所有4个HTML网站在登录失败或用户注销时无法访问。
我如何简单地使用HTML和Vanilla JS来处理可访问性部分?
登录.js
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var router = express.Router();
var cors = require('cors');
var ActiveDirectory = require('activedirectory');
const session = require('express-session');
app.use( bodyParser.json() ); // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({ // to support URL-encoded bodies
extended: true
}));
app.use(session({
name: 'session.sid',
secret: 'entersomepasswordhere',
resave: false,
saveUninitialized: false
}));
var port = process.env.PORT || 8080;
app.use('/', router);
router.post('/api/Login1', function(req, res)
{
var username = req.body.username;
var password = req.body.password;
console.log(username);
var config = {
url: 'abc',
baseDN: 'dc=abc,dc=abc'
};
var ad = new ActiveDirectory(config);
// Authenticate
ad.authenticate(username, password, function(err, auth) {
if (err) {
res.send("Login Failed. Incorrect username or password");
console.log('ERROR: '+JSON.stringify(err));
return;
}
if (auth) {
console.log('Authenticated!');
req.session.loggedin = true;
res.redirect('/test.html');
}
else {
console.log('Authentication failed!');
res.send("Login Failed. Incorrect username or password");
}
});
});
router.get('/test.html', function(req, res) {
if (req.session.loggedin == true) //check if user is loggedin, replace with your variables/checks
res.sendFile('/absolutepath/test.html');
else
res.redirect('/Login1');
})
app.use(cors());
app.listen(port);
console.log('Listening at port ' + port);
我想我知道问题出在哪里了。核心模块只是为你处理每一个请求,因此每一个http请求都会先在核心中间件中寻找是否有匹配的html文件。你需要将
app.use(cors());
当你定义了你的路由并定义了一个自定义的路由到你的test.html之后。请看下面的例子。
var express = require('express');
var app = express();
var router = express.Router();
var cors = require('cors');
var port = process.env.PORT || 8080;
//use routes on the localhost:8080 path
app.use('/', router);
//Relevant part:
router.get('/test.html', function(req, res) {
var loggedin = true; //false if not loggedin
if (loggedin)
res.sendFile(__dirname + '/test.html');
else
res.redirect('https://www.google.com/');
})
//This needs to be after the routes
app.use(cors());
app.listen(port);
console.log('Listening at port ' + port);
你可以将loggedin设置为false,看看如果用户没有登录会发生什么,如果用户登录了会发生什么。
更新
为了在用户登录时保存,我建议使用express-session模块。https:/expressjs.comenresourcesmiddlewarecookie-session.html。
你可以像下面这样加入。
const session = require('express-session');
app.use(session({
name: 'session.sid',
secret: 'entersomepasswordhere',
resave: false,
saveUninitialized: false
}));
在认证后,你可以只设置
req.session.loggedin = true;
然后检查是否
req.session.loggedin == true
注意:你可以用任何你喜欢的变量名替换loggedin,你也可以设置多个会话cookie。
在你的情况下,只要在重定向到test.html之前设置req.session.loggedin = true,然后在那里进行检查。