我想在Flatiron堆栈中实现身份验证和授权(使用Flatiron,Resourceful和Restful)。我想要求用户在尝试更改资源时拥有必要的权限。在Restful自述文件中,有note about authorization:
有几种方法可以提供安全性和授权 访问restful暴露的资源方法。推荐 授权模式是使用资源丰富的
before
能力 和after
钩子。在这些钩子中,您可以添加其他业务逻辑 限制访问资源的方法。不建议在路由中放置授权逻辑 层,在理想的世界中,路由器将是一个反射的接口 资源。从理论上讲,路由器本身的安全性应该如此 因为资源可能有多个,所以有点无关紧要 反映了所有需要相同业务逻辑的接口。
TL; DR;为了安全和授权,您应该使用资源丰富的
before
和after
挂钩。
因此授权可以由Resourceful的挂钩系统处理。
我的实际问题是每个HTTP请求开始时的身份验证过程。
我们说我有资源Post
,User
和资源Session
。 REST API是使用Restful定义的。我对这个问题的主要关注是确保用户在创建帖子时有会话。其他方法(如save
,update
或其他资源(如创建用户)应该类似。
档案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请求。
答案 0 :(得分:4)
请注意,这些指南适用于授权流程。如果您需要使用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');
}
}
]
});
以下project example使用此方法。