我想在Flatiron堆栈中实现身份验证和授权(使用 Flatiron、Resourceful 和 Restful)。在尝试更改资源时,我想要求用户具有必要的权限。在 Restful 自述文件中,有一条关于授权的说明:
有几种方法可以为访问用 restful 公开的资源方法提供安全性和授权。推荐的授权模式是使用资源丰富的 for
before
和after
hooks 能力。在这些钩子中,您可以添加额外的业务逻辑来限制对资源方法的访问。不建议将授权逻辑放置在路由层中,因为在理想情况下,路由器将是资源的反射接口。理论上,路由器本身的安全性应该是无关紧要的,因为资源可能有多个反射接口,它们都需要相同的业务逻辑。
TL;博士; 为了安全和授权,你应该使用足智多谋的
before
和after
钩子。
所以授权可以通过 Resourceful 的 hooking 系统来处理。
我的实际问题是每个 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();
});
还有一个可运行的代码版本(感谢@generalhenry)。
所以假设一个用户试图创建一个帖子,已经被赋予了一个会话 id,这个会话 ID 是随着他通过 cookie 标头发出的每个请求而发送的。如何在 before 钩子(即authorization
回调)中访问该 cookie?
该示例可以从 开始,node app.js
HTTP 请求可以使用curl
.