Authentication and authorization with Flatiron's Resourc
Authentication and authorization with Flatiron's Resourceful & Restful
我想在Flatiron堆栈中实现身份验证和授权(使用Flatiron、Resourceful和Restful)。我想要求用户在尝试更改资源时具有必要的权限。在Restful自述文件中,有一个关于授权的说明:
提供安全性和授权的方法有几种访问restful公开的资源方法。推荐的授权模式是对
before
使用resourceful的能力和after
挂钩。在这些挂钩中,您可以添加额外的业务逻辑限制对资源方法的访问建议在路由中放置授权逻辑,不建议使用层,因为在理想世界中路由器将是一个反射接口资源的。从理论上讲,路由器本身的安全性应该在某种程度上是不相关的,因为资源可能有多个所有需要相同业务逻辑的反射接口
TL,博士;为了安全和授权,您应该使用resourceful
before
和after
钩子
所以授权可以由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');
}
}
]
});
下面是使用此方法的项目示例