通过websockets进行Sails.js + Passport.js身份验证

Ell*_*ngs 32 node.js socket.io sails.js passport.js

当我使用带有Passport.js的Sails.js时,通过websocket请求时,req对象上不存在isAuthenticated方法.

谁能告诉我为什么会这样?

xdi*_*ent 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();
};
Run Code Online (Sandbox Code Playgroud)

使用此方法,您无需特殊处理即可检查策略中的套接字请求身份验证.您仍然需要通过快速中间件来挂接非套接字请求的护照.


ata*_*man 14

请尝试检查req.session.passport.user.它将在登录时包含用户信息,否则将不确定.适用于任何类型的请求.

我认为这是因为在WebSocket请求的情况下,"req"实际上是假的请求对象.它创建并直接传递给Express'路由器,绕过所有Express'中间件,包括Passport的中间件


mik*_*eil 11

@ataman是完全正确的.使用express.customMiddleware配置安装的Express中间件仅适用于Express HTTP请求.

要获得所有请求的护照,请在您的政策中使用它:

// e.g. 
// config/policies.js
module.exports = {
  SomeController: {
    someaction: function somePassportMiddlewareFn() {}
  }
};
Run Code Online (Sandbox Code Playgroud)