嗨,我试图使用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
}
我搜索了一下,发现我必须使用两个端点套接字,一个是用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
}