【问题标题】:How to use passportSocketIo and socketioJwt in io.use如何在io.use中使用passportSocketIo和socketioJwt
【发布时间】:2020-09-10 23:06:47
【问题描述】:

您好,我正在尝试使用 passportSocketIo 和 socketioJwt 验证套接字连接,第一个用于 Web 目的,第二个用于 API 验证,passportSocketIo 工作正常,但是 如果我发送JWT或passportSocketIo,我怎样才能让这个中间件(io.use)选择socketioJwt,原因是我不知道如何设置中间件,我有一些这样的:

let express =                    require('express');
let app =                                 express();
let http =        require('http').createServer(app);
let socket =              require('socket.io')(http);
const cookieparser =        require('cookie-parser');
const session =           require('express-session');
const passport =                 require('passport');
const passportSocketIo =require("passport.socketio");
const socketioJwt   =        require("socketio-jwt");
const MongoStore = require('connect-mongo')(session);


let io = require('./helpers/Socket.js').listen(http);


app.use(session({
  key: 'connect.sid',
    secret: 'secret',
    resave: true,
    store: sessionStore
}))
app.use(passport.initialize());
app.use(passport.session());


io.use(passportSocketIo.authorize({
    passport : passport,
    cookieParser: cookieparser,        // the same middleware you registrer in express
    key:          'connect.sid',       // the name of the cookie where express/connect stores its session_id
    secret:       'secret',    // the session_secret to parse the cookie
    store:        sessionStore,        // we NEED to use a sessionstore. no memorystore please
    success:      onAuthorizeSuccess,  // *optional* callback on success - read more below
    fail:         onAuthorizeFail,     // *optional* callback on fail/error - read more below
  }),socketioJwt.authorize({
    secret: 'jwt_secret',
    handshake: true
  }));

Socket.js


let app =                      require('express');
const passport = require('passport');
var socket = require('socket.io')
const Order = require('../models/Order')
const User = require('../models/User')

const { isLoggedIn } = require('../helpers/Auth');


module.exports.listen = function(http) {
    io = socket.listen(http)


    io.on('connection', async (socket, req) => {
        socket.emit('welcome', { message: 'Connected to app' });

        //get socketId
        console.log('connected: ',socket.request.user.facebook.name);
        const socketId = socket.id;
        //get userId
        const id = socket.request.user;
        //LookUp userId and save/update socketId in to User
        const user = await User.findByIdAndUpdate( id, {socketId} );



        socket.on('disconnect', async() => {

        //get socketId
        const socketId = null;
        //get userId
        const id = socket.request.user;
        //LookUp userId and update socketId from User
        const user = await User.findByIdAndUpdate( id, {socketId} );

            console.log('Se desconectó:', user.facebook.name);
        });




        socket.on('status',  async function(data) {

        // Destructure data
            const {status, _id, userId} = data;
        // Look Up Order bt id
            const orden = await Order.findByIdAndUpdate  ( _id, { status  });
        // Look Up User by id
            const user   = await User.findById( {_id : userId});
        //Set the socketId in to emit event
        if(user.socketId === null){console.log('User Not available')}
        else{
            socket.to(user.socketId).emit( 'status_updated', orden )
            console.log(data);
            }
        });
   }

   );


    console.log('in socket');









    return io
}


【问题讨论】:

    标签: node.js api socket.io jwt passport.js


    【解决方案1】:

    我已经搜索过,我发现我必须使用两个端点套接字,一个用于使用 cookie 的护照,另一个用于 jwt,所以我必须使用套接字添加一个新文件

    let io = require('./helpers/Socket.js').listen(http);
    let io2 = require('./helpers/Socket_Jwt.js').listen(http);
    
    io.use(passportSocketIo.authorize({
        passport : passport,
        cookieParser: cookieparser,        // the same middleware you registrer in express
        key:          'connect.sid',       // the name of the cookie where express/connect stores its session_id
        secret:       'secret',    // the session_secret to parse the cookie
        store:        sessionStore,        // we NEED to use a sessionstore. no memorystore please
        success:      onAuthorizeSuccess,  // *optional* callback on success - read more below
        fail:         onAuthorizeFail,     // *optional* callback on fail/error - read more below
      }));
    io2.use(socketioJwt.authorize({
        secret: 'jwt_secret',
        handshake: true
      })
    
    

    socket_jwt.js

    
    var socket = require('socket.io')
    
    
    
    module.exports.listen = function(http) {
        io2 = socket.listen(http)
    
    
     io.on('connection', async (socket, req) => {
            socket.emit('welcome', { message: 'Connected to api' });
    }
    
        return io2
    }
    
    
    
    

    【讨论】:

      猜你喜欢
      • 2021-01-18
      • 2016-04-22
      • 2018-10-04
      • 1970-01-01
      • 2016-02-23
      • 2020-05-28
      • 2015-12-06
      • 2014-10-27
      • 2020-11-19
      相关资源
      最近更新 更多