使用Flatiron的Resourceful& amp;认证和授权宁静

时间:2013-03-15 10:51:07

标签: javascript node.js flatiron.js

我想在Flatiron堆栈中实现身份验证和授权(使用Flatiron,Resourceful和Restful)。我想要求用户在尝试更改资源时拥有必要的权限。在Restful自述文件中,有note about authorization

  

有几种方法可以提供安全性和授权   访问restful暴露的资源方法。推荐   授权模式是使用资源丰富的before能力   和after钩子。在这些钩子中,您可以添加其他业务逻辑   限制访问资源的方法。

     

建议在路由中放置授权逻辑   层,在理想的世界中,路由器将是一个反射的接口   资源。从理论上讲,路由器本身的安全性应该如此   因为资源可能有多个,所以有点无关紧要   反映了所有需要相同业务逻辑的接口。

     

TL; DR;为了安全和授权,您应该使用资源丰富的   beforeafter挂钩。

因此授权可以由Resourceful的挂钩系统处理。

我的实际问题是每个HTTP请求开始时的身份验证过程。

我们说我有资源PostUser和资源Session。 REST API是使用Restful定义的。我对这个问题的主要关注是确保用户在创建帖子时有会话。其他方法(如saveupdate或其他资源(如创建用户)应该类似。

档案app.js

var flatiron = require('flatiron');
var app = flatiron.app;

app.resources = require('./resources.js');

app.use(flatiron.plugins.http);
app.use(restful);
app.start(8080, function(){
  console.log('http server started on port 8080');
});

档案resources.js

var resourceful = require('resourceful');

var resources = exports;

resources.User = resourceful.define('user', function() {
  this.restful = true;
  this.string('name');
  this.string('password');
});

resources.Session = resourceful.define('session', function() {
  // note: this is not restful
  this.use('memory');
  this.string('session_id');
});

resources.Post = resourceful.define('post', function() {
  this.restful = true;
  this.use('memory');
  this.string('title');
  this.string('content');
});

resources.Post.before('create', function authorization(post, callback) {
  // What should happen here?
  // How do I ensure, a user has a session id?

  callback();
});

还有runnable version of the code(感谢@generalhenry)。

因此,假设一个用户试图创建一个帖子,已经被赋予了一个会话ID,这个会话ID是通过cookie头的每个请求发送的。如何在前钩子(即authorization回调)中访问该cookie?

该示例可以使用node app.js启动,并且可以使用curl进行HTTP请求。

1 个答案:

答案 0 :(得分:4)

请注意,这些指南适用于授权流程。如果您需要使用sessionId,则可以通过以下方式访问它:req.sessionIDreq.cookies["connect.sid"]

通过这种方式检查请求,您将确保每个用户都有有效的会话ID。

app.use(flatiron.plugins.http, {
  before: [
    connect.favicon(),
    connect.cookieParser('catpsy speeds'),
    function(req, res) {
      if (req.originalUrl === undefined) {
        req.originalUrl = req.url;
      }
      res.emit('next');
    },
    connect.session({secret : 'secter'}),
    function(req, res) {
      console.log('Authenticating...');
      console.dir(req.session);
      //any other validation logic
      if (req.url !== '/login' && typeof req.session.user == 'undefined') {
        res.redirect('/login');
      } else {
        res.emit('next');
      }
    }
  ]
});

以下project example使用此方法。