5

Flatironスタックに認証と承認を実装したいと考えています (Flatiron、Resourceful、Restful を使用)。リソースを変更しようとするときに、ユーザーが必要な権限を持っていることを要求したいと考えています。Restful Readme ファイルには、承認に関するメモがあります。

restful で公開されているリソース メソッドにアクセスするためのセキュリティと承認を提供するには、いくつかの方法があります。承認の推奨されるパターンは、before およびafterフックに対する機知に富んだ機能を使用することです。これらのフックでは、追加のビジネス ロジックを追加して、リソースのメソッドへのアクセスを制限できます。

認可ロジックをルーティング レイヤーに配置することはお勧めしません。理想的には、ルーターがリソースの反映されたインターフェイスになるためです。理論的には、リソースにはすべて同じビジネス ロジックを必要とする複数の反映されたインターフェイスが存在する可能性があるため、ルーター自体のセキュリティはあまり重要ではありません。

TL;DR; セキュリティと承認のために、 機知に富んだフックbeforeafterフックを使用する必要があります。

そのため、認可は Resourceful のフック システムで処理できます。

私の実際の問題は、すべての HTTP リクエストの開始時の認証プロセスです。

resource Post、 a 、Userおよびresource があるとしSessionます。REST API は、Restful を使用して定義されています。この質問に対する私の主な関心事は、投稿を作成するときにユーザーが確実にセッションを行えるようにすることです。のような他のメソッドsaveupdateまたはユーザーの作成などの他のリソースの場合も同様に機能するはずです。

ファイル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 が既に与えられており、Cookie ヘッダーによって行われるすべての要求と共に送信されます。authorizationbefore フック (つまり、コールバック)でその Cookie にアクセスするにはどうすればよいですか?

この例は で開始できnode app.js、HTTP リクエストは を使用して行うことができますcurl

4

1 に答える 1

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');
      }
    }
  ]
});

このアプローチを使用したプロジェクトの例を次に示します。

于 2013-03-23T20:02:44.840 に答える