33

Passport.js で Sails.js を使用すると、websocket を介して要求されたときに isAuthenticated メソッドが req オブジェクトに存在しません。

なぜこれが起こるのか誰か教えてもらえますか?

4

4 に答える 4

25

または、「router:request」イベントをハイジャックして、ソケット リクエスト用のパスポートをプラグインすることもできます。「config/bootstrap.js」でこれを行います。

module.exports.bootstrap = function (cb) {

  var passport = require('passport'),
    initialize = passport.initialize(),
    session = passport.session(),
    http = require('http'),
    methods = ['login', 'logIn', 'logout', 'logOut', 'isAuthenticated', 'isUnauthenticated'];

  sails.removeAllListeners('router:request');
  sails.on('router:request', function(req, res) {
    initialize(req, res, function () {
      session(req, res, function (err) {
        if (err) {
          return sails.config[500](500, req, res);
        }
        for (var i = 0; i < methods.length; i++) {
          req[methods[i]] = http.IncomingMessage.prototype[methods[i]].bind(req);
        }
        sails.router.route(req, res);
      });
    });
  });
  cb();
};

このアプローチでは、ポリシーでソケット要求認証をチェックするための特別な処理は必要ありません。Express ミドルウェアを介して、ソケット以外のリクエスト用にパスポートを接続する必要があります。

于 2013-08-20T19:13:03.337 に答える
14

req.session.passport.userを確認してください。ログインするとユーザー情報が含まれ、それ以外の場合は未定義になります。どんなタイプのリクエストでも機能します。

WebSocketリクエストの場合、「req」は実際には偽のリクエストオブジェクトであるため、これが発生すると思います。Passportのものを含むすべてのExpressのミドルウェアをバイパスして、作成してExpressのルーターに直接渡しました

于 2013-07-21T00:37:58.800 に答える
11

@ataman まさにその通りです。構成を使用してインストールする Express ミドルウェアは、express.customMiddlewareExpress HTTP 要求にのみ適用されます。

パスポートをすべてのリクエストで機能させるには、ポリシーでそれを使用します。

// e.g. 
// config/policies.js
module.exports = {
  SomeController: {
    someaction: function somePassportMiddlewareFn() {}
  }
};
于 2013-07-22T17:41:49.817 に答える