Javascript 通过Flatiron'认证和授权;s足智多谋&;宁静的

Javascript 通过Flatiron'认证和授权;s足智多谋&;宁静的,javascript,node.js,flatiron.js,Javascript,Node.js,Flatiron.js,我想在堆栈中实现身份验证和授权(使用Flatiron、Resourceful和Restful)。我想要求用户在尝试更改资源时具有必要的权限。在Restful自述文件中,有一个: 有几种方法可以为提供安全性和授权 访问restful公开的资源方法。推荐的 授权模式是在 和挂钩后的。在这些钩子中,您可以添加额外的业务逻辑 限制对资源方法的访问 不建议在路由中放置授权逻辑 层,在理想世界中,路由器将是一个反射接口 资源的使用。从理论上讲,路由器本身的安全性应该 有些不相关,因为资源可能有多个 反映了所

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

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

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

TL;博士为了安全和授权,您应该使用resourceful的
之前
之后
挂钩。

所以授权可以通过Resourceful的挂钩系统来处理

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

假设我有一个资源
Post
,一个
用户
和一个资源
会话
。RESTAPI是使用Restful定义的。我对这个问题的主要关注是确保用户在创建帖子时有一个会话。其他方法,如
保存
更新
或其他资源,如创建用户,也应类似地工作

文件
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');
});
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();
});
文件
resources.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');
});
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)

因此,假设一个用户试图创建一个post,并且已经获得了一个会话id,该id随cookie头发出的每个请求一起发送。如何访问before钩子中的cookie(即
authorization
回调)


该示例可以从
node app.js
开始,并且可以使用
curl

发出HTTP请求。请记住,这些指南用于授权过程。如果您需要使用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');
      }
    }
  ]
});

这里是使用这种方法。

我制作了一个可运行的版本@generalhenry谢谢!让我们来玩这个,谢谢你的例子。这很有帮助。我不在工作,所以我不能立即尝试,但它看起来很有希望,尽管它需要
connect
,而我目前没有使用它。但我想我能弄清楚它的作用。顺便说一句,我改进了缩进,因此它更具可读性,我认为
val===undefined
不是一个好的做法,所以我将它改为
typeof val=='undefined'
。我不确定这一点。在第4点和第5点查看jquery项目的最佳实践。我仍然认为
typeof val==“undefined”
更好,但还行。