我是一个新的解析,并试图用它创建一个简单的Web应用程序,使用静态HTML页面,CSS,和JSI已经使用云函数也为一些任务。
事情是这样的,我创建了一个登录页面和一个检查用户是否用JS客户端登录到web应用的函数,它看起来像这样。
function CheckUserLogin(){
var currentUser = Parse.User.current();
if (currentUser) {
//do nothing
} else {
//rediect user to login html page
window.location.href = “loginpage.html”
}
}
如果用户通过浏览器URL导航到Home.html页面,他可以看到该页面几秒钟,直到js检查他是否登录,并将用户重定向到登录页面,我想这不是很安全... ...
有什么办法可以让通过js或parse.com云函数实现这个任务的方案更安全吗?
你可以做以下两件事来实现。
首先,你需要用你自己的自定义登录来覆盖Parsse登录,你可以做这样的事情。
// this will add sessionToken in a cookie, which can be later used to check if your user is logged in or not
app.post('/login', function(req, res) {
Parse.User.logIn(req.body.username, req.body.password).then(function(user) {
var val = JSON.stringify({sessionToken: user.getSessionToken()});
var opts = {path: '/', httpOnly: true};
res.cookie('parse.session', val, opts);
res.redirect('/');
}).then(null, function(error) {
res.clearCookie('parse.session');
res.render('pages/login', { flash: error.message });
});
});
现在你需要添加一个中间件来从cookie中获取这个用户。
// Middleware adding current user to `req.user` or redirecting to login if not logged in
app.use(function (req, res, next) {
var cookie = null;
new Parse.Promise.as().then(function() {
cookie = JSON.parse(req.cookies['parse.session']);
return Parse._request('GET', 'users/me', {}, {sessionToken: cookie.sessionToken});
}).then(function (userData) {
userData.sessionToken = cookie.sessionToken;
req.user = Parse.Object.fromJSON(userData);
next();
}).then(null, function () {
res.clearCookie('parse.session');
return res.redirect('/login');
});
});
现在你可以放心地假设,如果用户访问了Home.html,它将是一个已登录的用户。不过我还是不建议把HTML文件放在公共文件夹里,而是使用模板引擎。