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