如何在 io.use 中使用 passportSocketIo 和 socketioJwt。

问题描述 投票:0回答:1

嗨,我试图使用passportSocketIo和socketioJwt来验证套接字连接,第一个它一直用于web目的,第二个用于API auth,passportSocketIo工作得很好,但我如何能使这个中间件(io.use)选择socketioJwt,如果我发送JWT或passportSocketIo,原因是我不知道如何设置中间件,我有一些像这样。

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个回答
0
投票

我搜索了一下,发现我必须使用两个端点套接字,一个是用cookie的passport,另一个是用jwt的,所以我必须用socket添加一个新的文件。

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
}



© www.soinside.com 2019 - 2024. All rights reserved.