【发布时间】: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