使用 http-auth 进行身份验证时从 socket.io 获取用户对象



我想在建立 socket.io 连接时获取用户对象。这样我就可以记录用户的操作。

使用express.js我可以像这样获得用户:

app.get('/', function(req, res) {
    // req.user
})

如何从 socket.io 连接获取用户?我的 socket.io 实现使用与express.js相同的http服务器。

这是代码:

var auth = require('http-auth')
var basic = auth.basic({
    file: __dirname + '/.htpasswd'
})
var express = require('express')
var app = express()
var http = require('http')
var server = http.createServer(basic, app)
var io = require('socket.io')(server)
io.on('connection', function(socket) {
    // how to get user?
})

谢谢:)

var request = require('request');
request('/users', function (error, response, body) {
  if (!error && response.statusCode == 200) {
     var users = body.users;
     io.on('connection', function(socket) {
           // IO EMIT USERS
     }
  }
})

或。。。

io.on('connection', function(socket) {
  var request = require('request');
  request('/users', function (error, response, body) {
  if (!error && response.statusCode == 200) {
     var users = body.users;
           // IO EMIT USERS
     }
  })
}

socket.io 通信不会由 http-auth 自动进行身份验证。您必须自己验证 socket.io。

为此,您可以重用 http-auth 中的内部函数isAuthenticated(req, callback),并使用 io.use() 将其实现为 socket.io 中间件:

io.use((socket, next) => {
    // The first argument of 'isAuthenticated()' expects the http 'request' object.
    // It needs it to access the 'headers' object (request.headers)
    // We can also find the 'headers' object in 'socket.handshake', so we pass that.
    //
    // source of 'isAuthenticated()':
    // https://github.com/http-auth/http-auth/blob/c7e078ad1d7d0def72ed198860d6352f262b90e6/src/auth/base.js#L82
    basic.isAuthenticated(socket.handshake, result => {
        if (result instanceof Error) {
            next(result);
        } else if (!result.pass) {
            next(new Error('Authentication error'));
        } else {
            socket.user = result.user; // make sure you can access the user later
            next();
        }
    });
});

然后,您可以稍后通过以下方式访问用户:

io.on('connection', function(socket) {
    console.log(socket.user);
});

最新更新