Passport.jsでSails.jsを使用する場合、WebSocketを介して要求されたときに、isAuthenticatedメソッドがreqオブジェクトに存在しません。
なぜこれが起こるのか誰か教えてもらえますか?
または、「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();
};
このアプローチでは、ポリシーでソケット要求認証をチェックするための特別な処理は必要ありません。エクスプレスミドルウェアを使用して、ソケット以外のリクエストのパスポートを接続する必要があります。
req.session.passport.userを確認してみてください。ログインするとユーザー情報が含まれ、それ以外の場合は未定義になります。どんなタイプのリクエストでもうまくいきます。
これは、WebSocketリクエストの場合、「req」が実際には偽のリクエストオブジェクトであるために発生すると思います。 Passportのものを含むすべてのExpressのミドルウェアをバイパスして、Expressのルーターを作成して直接渡しました。
@atamanは正確に正しいです。 express.customMiddleware
構成を使用してインストールするExpressミドルウェアは、ExpressHTTPリクエストにのみ適用されます。
パスポートをすべてのリクエストで機能させるには、ポリシーでパスポートを使用します。
// e.g.
// config/policies.js
module.exports = {
SomeController: {
someaction: function somePassportMiddlewareFn() {}
}
};
パスポートで定義されたメソッドlogin、logout、...を使用してsocket.io reqを拡張する別の方法は、ポリシーまたはミドルウェアを次のように書き直すことです。
module.exports = (req, res, next) ->
if req.isSocket
req = _.extend req, _.pick(require('http').IncomingMessage.prototype, 'login', 'logIn', 'logout', 'logOut', 'isAuthenticated', 'isUnauthenticated')
middleware = passport.authenticate('bearer', { session: false })
middleware(req, res, next)