Аутентификация и авторизация с помощью Flatiron's Resourceful & Restful
Я хочу реализовать аутентификацию и авторизацию в стеке Flatiron (используя Flatiron, Resourceful и Restful). Я хочу требовать, чтобы пользователь имел необходимые разрешения при попытке изменить ресурс. В файле Restful Readme есть примечание об авторизации:
Существует несколько способов обеспечения безопасности и авторизации для доступа к методам ресурсов, предоставляемым с помощью restful. Рекомендуемый шаблон для авторизации - использовать способность
before
а такжеafter
крючки. В этих хуках вы можете добавить дополнительную бизнес-логику, чтобы ограничить доступ к методам ресурса.Не рекомендуется размещать логику авторизации на уровне маршрутизации, так как в идеальном мире маршрутизатор будет отраженным интерфейсом ресурса. Теоретически, безопасность самого маршрутизатора должна быть несколько нерелевантной, поскольку ресурс может иметь несколько отраженных интерфейсов, которые требуют одинаковой бизнес-логики.
TL; DR; Для безопасности и авторизации вы должны использовать ресурсы
before
а такжеafter
крючки.
Таким образом, авторизация может быть обработана системой перехвата ресурсов.
Моя настоящая проблема - процесс аутентификации в начале каждого 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).
Итак, предположим, что пользователь, пытающийся создать сообщение, уже получил идентификатор сеанса, который отправляется с каждым запросом, который он делает с помощью заголовка файла cookie. Как я могу получить доступ к этому cookie в хуке before (т.е. authorization
Перезвоните)?
Пример можно начать с node app.js
и HTTP-запросы могут быть сделаны с помощью curl
,
1 ответ
Имейте в виду, что эти рекомендации предназначены для процесса авторизации. Если вам нужно использовать sessionId, вы можете получить к нему доступ любым способом: req.sessionID
, req.cookies["connect.sid"]
,
Проверяя запросы таким образом, вы будете уверены, что у каждого пользователя есть действительный идентификатор сеанса.
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');
}
}
]
});
Вот пример проекта с использованием этого подхода.