node.js - 如何在io.use中使用passportSocketIo和socketioJwt
问题描述
嗨,我正在尝试使用 passportSocketIo 和 socketioJwt 验证套接字连接,第一个用于 Web 目的,第二个用于 API 身份验证,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
}));
套接字.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 的护照,另一个用于 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
}
推荐阅读
- python - 以微秒精度打印消息
- java - java.lang.NullPointerException Andriod Studio Java
- machine-learning - 如何计算精度和F1?
- c++ - 如何扩展先前初始化的内存大小?
- winapi - 禁用在 Windows 10 时间轴中显示的项目
- mysql - docker-compose MySQL 容器,用于使用 GithubActions 进行自动化测试
- python - 奇怪的AttributeError仅在赋值时
- angularjs - 预置资源以通过 AWS CloudFormation 部署 React(MERN)/Angular(MEAN) 应用程序
- twitter-bootstrap - Bootstrap 4下拉菜单在.net MVC上不起作用
- amazon-web-services - Amazon AWS 将 IP 地址重定向到域名