我想在建立 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);
});