所以我快速的打了一个小应用程序(代码在底部),我有几个问题.
>会话变量是否安全?我可以使用会话变量来存储稍后读取以获取敏感日期的用户标识符.是否可以修改会话变量,以便在我的情况下,一个用户可以抓住另一个用户的数据?
>按照我在’/ profile’路线上的方式来提供JSON是有意义的.在我的应用程序中,将有很多路线就像那个.从数据库中获取东西并将其作为JSON提供给客户端的路由.
看我的代码,你有什么提示或技巧吗?我应该做的不同.模块我可能应该看看?
>我的想法几乎只有JSON的后端是有意义的吗?
我的应用程序在下面.
var facebook = { 'appId' : "my app id",'appSecret' : "my app secret",'scope' : "email",'callback' : "http://localhost:2000/" } var express = require('express'); var MongoStore = require('connect-mongo'); var auth = require('connect-auth') var UserProvider = require('./providers/user').UserProvider; var app = module.exports = express.createServer(); // Configuration app.configure(function(){ app.set('views',__dirname + '/views'); app.set('view engine','jade'); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieParser()); app.use(auth([auth.Facebook(facebook)])); app.use(express.session({secret: 'my secret',store: new MongoStore({db: 'app'})})); app.use(express.compiler({ src: __dirname + '/public',enable: ['less'] })); app.use(app.router); app.use(express.static(__dirname + '/public')); }); app.configure('development',function(){ app.use(express.errorHandler({ dumpExceptions: true,showStack: true })); }); app.configure('production',function(){ app.use(express.errorHandler()); }); // Providers var UserProvider = new UserProvider('localhost',27017); // Routes app.get('/',function( request,response ) { if( !request.session.userId ) { request.authenticate(['facebook'],function(error,authenticated) { if( authenticated ) { request.session.userId = request.getAuthDetails().user.id; } }); } response.render( 'index.jade' ); }); app.get('/profile',response ) { response.contentType('application/json'); if( request.session.userId ){ UserProvider.findById( request.session.userId,function( error,user ){ var userJSON = JSON.stringify( user ); response.send( userJSON ); }); } else { response.writeHead(303,{ 'Location': "/" }); } }); app.get('/logout',response,params ) { request.session.destroy(); request.logout(); response.writeHead(303,{ 'Location': "/" }); response.end(''); }); app.listen(2000); console.log("Express server listening on port %d in %s mode",app.address().port,app.settings.env);
解决方法
>定义路由 – 如果您定义了大量路由,特别是使用JSON,则可能需要通过MVC类型框架动态定义它们.您可以找到这个in the express samples here的一个很好的例子.它将为您节省大量手写路由,您可以将节点对象作为JSON传回客户端,而不会在服务器端执行其他任何操作.
>服务器上的主干 – 如果你想要一点点疯狂(我从来没有使用过这种技术),Development Seed已经建立了一个名为bones的框架,即uses backbone on the server side.
>登录示例 – 有关用户会话管理的a good tutorial over at DailyJS.
>可访问性 – 只要您没有可访问性问题,通过REST API提供数据是有道理的.如果您必须担心合规性或其他javascript限制,可能会遇到问题.
对于安全性,将会话超时设置为较低的值并选择适当的密钥可能会有助于确保某人无法生成会话cookie(默认情况下实际数据不存储在客户端上).我不知道node.js使用什么算法来生成会话cookie.以下是express session middleware的一些细节.