jeudi 1 janvier 2015

Meteor cookies and Server side routes


It seems that in Meteor, we cannot call a server side route to render a file to the page without some sort of work-around from our normal workflow, from what I've read about server side routes. I hope I'm wrong about this, and there's a simple way to achieve what I'm looking to do...


Software/Versions


I'm using the latest Iron Router 1.* and Meteor 1.* and to begin, I'm just using accounts-password.


Background/Context


I have an onBeforeAction that simply redirects the user to either the welcome page or home page base upon if the user is logged in or not:


both/routes.js



Router.onBeforeAction(function () {
if (!Meteor.user() || Meteor.loggingIn())
this.redirect('welcome.view');
else
this.next();
}
,{except: 'welcome.view'}
);

Router.onBeforeAction(function () {
if (Meteor.user())
this.redirect('home.view');
else
this.next();
}
,{only: 'welcome.view'}
);


In the same file, both/routes.js, I have a simple server side route that renders a pdf to the screen, and if I remove the onBeforeAction code, the route works (the pdf renders to the page):



Router.route('/pdf-server', function() {
var filePath = process.env.PWD + "/server/.files/users/test.pdf";
console.log(filePath);
var fs = Npm.require('fs');
var data = fs.readFileSync(filePath);
this.response.write(data);
this.response.end();
}, {where: 'server'});


Exception thrown on Server Route


It's beside the point, but I get an exception when I add the above server side route to the file and take the route /pdf-server, while keeping the onBeforeAction code in place.


Insights into the exception can be found here: SO Question on Exception


Cookie related code added


I found another SO answer where a method to set and get the cookies is outlined here: SO Cookies technique


And then I added the following code to my project: client/main.js



Deps.autorun(function() {
if(Accounts.loginServicesConfigured() && Meteor.userId()) {
setCookie("meteor_userid",Meteor.userId(),30);
setCookie("meteor_logintoken",localStorage.getItem("Meteor.loginToken"),30);
}
});


But this does not work as expected, the setCookie code is not valid for some reason.


My Questions



Question 1: Using cookies, how do I inform the server of the authentication1 state based on these cookies? Or, another way, How does adding the cookie check in my server side route "inform" the server about the user? I could check for anything in this route really; I could reject any user, but somehow the server needs to "know" about the user logged in right?


Side Question: Is cookies the best way to go about this, or is there a simpler way to achieve the same thing?



Note: this question is a subset of a larger SO question found here, but I thought I'd break this out as the topic really deserves its own question IMO.





Aucun commentaire:

Enregistrer un commentaire