Аутентификация и авторизация с помощью 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');
      }
    }
  ]
});

Вот пример проекта с использованием этого подхода.

Другие вопросы по тегам