Authentication and authorization with Flatiron's Resourc

Authentication and authorization with Flatiron's Resourceful & Restful

本文关键字:Resourc Flatiron and authorization with Authentication      更新时间:2023-09-26

我想在Flatiron堆栈中实现身份验证和授权(使用Flatiron、Resourceful和Restful)。我想要求用户在尝试更改资源时具有必要的权限。在Restful自述文件中,有一个关于授权的说明:

提供安全性和授权的方法有几种访问restful公开的资源方法。推荐的授权模式是对before使用resourceful的能力和after挂钩。在这些挂钩中,您可以添加额外的业务逻辑限制对资源方法的访问

建议在路由中放置授权逻辑,不建议使用层,因为在理想世界中路由器将是一个反射接口资源的。从理论上讲,路由器本身的安全性应该在某种程度上是不相关的,因为资源可能有多个所有需要相同业务逻辑的反射接口

TL,博士;为了安全和授权,您应该使用resourcefulbeforeafter钩子

所以授权可以由Resourceful的钩子系统来处理。

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

假设我有一个资源Post,一个User和一个资源Session。REST API是通过使用Restful定义的。我对这个问题的主要关注是确保用户在创建帖子时拥有会话。其他方法,如save, update或其他资源,如创建用户,应该类似的工作。

File 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');
});

File 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();
});

还有一个可运行版本的代码(感谢@generalhenry)。

所以假设一个用户试图创建一个帖子,已经给了一个会话id,他发出的每个请求都通过一个cookie头发送。我怎么能访问之前钩子cookie(即authorization回调)?

示例可以从node app.js开始,HTTP请求可以使用curl

请记住,这些指导方针是针对授权过程的。如果您需要使用sessionId,您可以通过以下方式访问:req.sessionID, req.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');
      }
    }
  ]
});

下面是使用此方法的项目示例