首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用http-auth进行身份验证时从socket.io获取用户对象

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

Stack Overflow用户
提问于 2016-01-18 23:08:19
回答 2查看 439关注 0票数 1

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

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

代码语言:javascript
复制
app.get('/', function(req, res) {
    // req.user
})

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

代码如下:

代码语言:javascript
复制
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?
})

谢谢:)

EN

回答 2

Stack Overflow用户

发布于 2016-01-19 02:31:58

代码语言:javascript
复制
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
     }
  }
})

或者..。

代码语言:javascript
复制
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
     }
  })
}
票数 1
EN

Stack Overflow用户

发布于 2019-01-21 16:17:27

http-auth不会自动验证socket.io通信。您必须自己验证socket.io。

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

代码语言:javascript
复制
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();
        }
    });
});

然后,您可以使用以下命令访问该用户:

代码语言:javascript
复制
io.on('connection', function(socket) {
    console.log(socket.user);
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34857928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档