【问题标题】:Authenticating Socket.io with Passport in Node.js在 Node.js 中使用 Passport 对 Socket.io 进行身份验证
【发布时间】:2022-07-11 16:58:21
【问题描述】:

我正在尝试使用 passport 设置 socket.io,但遇到了一些问题。
我想在打开连接之前对用户进行身份验证。 (如index.js文件所示)

当代码到达 passport.js 文件中的done(null, false) 时,它会崩溃并出现以下错误:

TypeError: res.end is not a function

我隐约了解此错误以及正在发生的事情,但不知道如何修复它。


我在 index 文件中添加了护照身份验证,以将其与 socket.io 中间件配对
注意: 我通常在路由中有这些身份验证,我认为我不应该在此处使用它们(可能在单独的文件中),但我想要这项工作,请随时改进)

Index.js:(套接字在末尾​​em>)

const config = require('./config/init');

const express = require('express')
const {Server} = require('socket.io')
const cors = require('cors');

require('./config/passport')
const passport = require('passport')
const requireAuth = passport.authenticate('jwt', {
    session: false
})


const app = express()

const logger = require('./config/logger');
const initMongo = require('./config/mongo')
const morgan = require('./config/morgan');
const WebSockets = require("./config/WebSockets")

const { errorConverter, errorHandler } = require('./app/middleware/error');


//***********************************************************
//Middlewares
//***********************************************************
app.set('port', config.port)

if (config.env !== 'test') {
    app.use(morgan.successHandler);
    app.use(morgan.errorHandler);
  }


app.use(cors());
app.options('*', cors())
app.use(passport.initialize())

app.use(express.urlencoded({
  extended:true,
  limit: '5mb'
}))
app.use(express.json({
  extended: true,
  limit: '5mb'
}))

app.use('/api', require('./app/routes'))

//***********************************************************
//***********************************************************



initMongo()

app.use('/uploads', express.static('uploads'));


app.use(errorConverter);
app.use(errorHandler);

const server = app.listen(app.get("port"), () => {
  logger.info("port running on " + app.get("port"));
});

//***********************************************************
//Initiate Sockets
//***********************************************************
global.io = new Server(server, {
  cors: {
      origin: "http://localhost:3000",
  }
});

global.io.use((socket, next) => {
  req = socket.request
  req.auth = socket.handshake.auth
  req.originalUrl = '/socket.io'
  requireAuth(req,{},next)
});

global.io.use((socket, next) => {
  console.log('sock: ',socket.request.user)
  if (socket.request.user) {
    next();
  } else {
    next(new Error('Unauthorized Chat'))
  }
})

global.io.on('connection', WebSockets.connection)
//***********************************************************

module.exports = app

Passport.js

const jwtLogin = new JwtStrategy(jwtOptions, (req, payload, done) => {
    try {
        User.findById(payload.data._id, (err, user) => {
            if (err) {
                return done(err, false)
            }
            return !user ? done(null, false) : done(null, user)
        })

    } catch (err) {
        done(err, false);
    }
})

passport.use(jwtLogin)

提前感谢您

【问题讨论】:

    标签: node.js websocket socket.io passport.js passport-jwt


    【解决方案1】:

    你能解决你的问题吗?我有一个非常相似的问题。

    【讨论】:

      猜你喜欢
      • 2016-07-19
      • 1970-01-01
      • 2018-01-29
      • 2016-08-15
      • 2015-03-16
      • 2020-02-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      相关资源
      最近更新 更多