首页 文章

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

提问于
浏览
32

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

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

4 回答

  • 0

    或者,您可以劫持'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();
    };
    

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

  • 25

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

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

  • 11

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

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

    // e.g. 
    // config/policies.js
    module.exports = {
      SomeController: {
        someaction: function somePassportMiddlewareFn() {}
      }
    };
    
  • 14

    使用护照定义方法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)
    

相关问题