Further work on sessions and authentication
parent
3495245e37
commit
4181afd1a3
|
|
@ -305,7 +305,7 @@ export default class RoomClient
|
||||||
|
|
||||||
login()
|
login()
|
||||||
{
|
{
|
||||||
const url = `/auth/login?roomId=${this._roomId}&peerId=${this._peerId}`;
|
const url = `/auth/login?id=${this._signalingSocket.io.engine.id}`;
|
||||||
|
|
||||||
this._loginWindow = window.open(url, 'loginWindow');
|
this._loginWindow = window.open(url, 'loginWindow');
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,32 @@ class Lobby extends EventEmitter
|
||||||
this._peers = {};
|
this._peers = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
authCallback(data, roomLocked)
|
||||||
|
{
|
||||||
|
logger.debug('authCallback() | [data:"%o", roomLocked:"%s"]', data, roomLocked);
|
||||||
|
|
||||||
|
const {
|
||||||
|
peerId,
|
||||||
|
displayName,
|
||||||
|
picture
|
||||||
|
} = data;
|
||||||
|
|
||||||
|
const peer = this._peers[peerId];
|
||||||
|
|
||||||
|
if (peer)
|
||||||
|
{
|
||||||
|
this._notification(peer.socket, 'auth', {
|
||||||
|
displayName : displayName,
|
||||||
|
picture : picture
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!roomLocked)
|
||||||
|
{
|
||||||
|
this.promotePeer(peerId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
peerList()
|
peerList()
|
||||||
{
|
{
|
||||||
logger.info('peerList()');
|
logger.info('peerList()');
|
||||||
|
|
@ -41,6 +67,11 @@ class Lobby extends EventEmitter
|
||||||
return Object.values(this._peers).map((peer) => ({ peerId: peer.peerId, displayName: peer.displayName }));
|
return Object.values(this._peers).map((peer) => ({ peerId: peer.peerId, displayName: peer.displayName }));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hasPeer(peerId)
|
||||||
|
{
|
||||||
|
return Boolean(this._peers[peerId]);
|
||||||
|
}
|
||||||
|
|
||||||
promoteAllPeers()
|
promoteAllPeers()
|
||||||
{
|
{
|
||||||
logger.info('promoteAllPeers()');
|
logger.info('promoteAllPeers()');
|
||||||
|
|
@ -58,9 +89,12 @@ class Lobby extends EventEmitter
|
||||||
|
|
||||||
const peer = this._peers[peerId];
|
const peer = this._peers[peerId];
|
||||||
|
|
||||||
this.emit('promotePeer', peer);
|
if (peer)
|
||||||
|
{
|
||||||
|
this.emit('promotePeer', peer);
|
||||||
|
|
||||||
delete this._peers[peerId];
|
delete this._peers[peerId];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
parkPeer({ peerId, consume, socket })
|
parkPeer({ peerId, consume, socket })
|
||||||
|
|
@ -119,6 +153,20 @@ class Lobby extends EventEmitter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_notification(socket, method, data = {}, broadcast = false)
|
||||||
|
{
|
||||||
|
if (broadcast)
|
||||||
|
{
|
||||||
|
socket.broadcast.to(this._roomId).emit(
|
||||||
|
'notification', { method, data }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
socket.emit('notification', { method, data });
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = Lobby;
|
module.exports = Lobby;
|
||||||
|
|
@ -260,6 +260,10 @@ class Room extends EventEmitter
|
||||||
picture : picture
|
picture : picture
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
else if (this._lobby.hasPeer(peerId))
|
||||||
|
{
|
||||||
|
this._lobby.authCallback(data, this._locked);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_handlePeer({ peer, consume })
|
_handlePeer({ peer, consume })
|
||||||
|
|
|
||||||
|
|
@ -11,12 +11,16 @@
|
||||||
"base-64": "^0.1.0",
|
"base-64": "^0.1.0",
|
||||||
"colors": "^1.1.2",
|
"colors": "^1.1.2",
|
||||||
"compression": "^1.7.3",
|
"compression": "^1.7.3",
|
||||||
|
"connect-redis": "^4.0.3",
|
||||||
|
"cookie-parser": "^1.4.4",
|
||||||
"debug": "^4.1.0",
|
"debug": "^4.1.0",
|
||||||
"express": "^4.16.3",
|
"express": "^4.16.3",
|
||||||
"express-session": "^1.16.1",
|
"express-session": "^1.16.1",
|
||||||
"mediasoup": "^3.0.12",
|
"mediasoup": "^3.0.12",
|
||||||
"openid-client": "^2.5.0",
|
"openid-client": "^2.5.0",
|
||||||
"passport": "^0.4.0",
|
"passport": "^0.4.0",
|
||||||
|
"passport.socketio": "^3.7.0",
|
||||||
|
"redis": "^2.8.0",
|
||||||
"socket.io": "^2.1.1",
|
"socket.io": "^2.1.1",
|
||||||
"spdy": "^4.0.0"
|
"spdy": "^4.0.0"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,12 @@ const base64 = require('base-64');
|
||||||
const passport = require('passport');
|
const passport = require('passport');
|
||||||
const { Issuer, Strategy } = require('openid-client');
|
const { Issuer, Strategy } = require('openid-client');
|
||||||
const session = require('express-session');
|
const session = require('express-session');
|
||||||
|
const passportSocketIo = require('passport.socketio');
|
||||||
|
const cookieParser = require('cookie-parser');
|
||||||
|
// Session storage
|
||||||
|
const redis = require('redis');
|
||||||
|
const RedisStore = require('connect-redis')(session);
|
||||||
|
const redisClient = redis.createClient();
|
||||||
|
|
||||||
/* eslint-disable no-console */
|
/* eslint-disable no-console */
|
||||||
console.log('- process.env.DEBUG:', process.env.DEBUG);
|
console.log('- process.env.DEBUG:', process.env.DEBUG);
|
||||||
|
|
@ -49,6 +55,8 @@ const tls =
|
||||||
key : fs.readFileSync(config.tls.key)
|
key : fs.readFileSync(config.tls.key)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const sessionStore = new RedisStore({ client: redisClient });
|
||||||
|
|
||||||
const app = express();
|
const app = express();
|
||||||
let httpsServer;
|
let httpsServer;
|
||||||
let oidcClient;
|
let oidcClient;
|
||||||
|
|
@ -202,6 +210,7 @@ async function setupAuth(oidcIssuer)
|
||||||
secret : config.cookieSecret,
|
secret : config.cookieSecret,
|
||||||
resave : true,
|
resave : true,
|
||||||
saveUninitialized : true,
|
saveUninitialized : true,
|
||||||
|
store : sessionStore,
|
||||||
cookie : { secure: true }
|
cookie : { secure: true }
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
@ -213,9 +222,8 @@ async function setupAuth(oidcIssuer)
|
||||||
{
|
{
|
||||||
passport.authenticate('oidc', {
|
passport.authenticate('oidc', {
|
||||||
state : base64.encode(JSON.stringify({
|
state : base64.encode(JSON.stringify({
|
||||||
roomId : req.query.roomId,
|
id : req.query.id,
|
||||||
peerId : req.query.peerId,
|
code : utils.random(10)
|
||||||
code : utils.random(10)
|
|
||||||
}))
|
}))
|
||||||
})(req, res, next);
|
})(req, res, next);
|
||||||
});
|
});
|
||||||
|
|
@ -235,39 +243,37 @@ async function setupAuth(oidcIssuer)
|
||||||
{
|
{
|
||||||
const state = JSON.parse(base64.decode(req.query.state));
|
const state = JSON.parse(base64.decode(req.query.state));
|
||||||
|
|
||||||
if (rooms.has(state.roomId))
|
let displayName;
|
||||||
|
let photo;
|
||||||
|
|
||||||
|
if (req.user != null)
|
||||||
{
|
{
|
||||||
let displayName;
|
if (req.user.displayName != null)
|
||||||
let photo;
|
displayName = req.user.displayName;
|
||||||
|
else
|
||||||
|
displayName = '';
|
||||||
|
|
||||||
if (req.user != null)
|
if (
|
||||||
|
req.user.Photos != null &&
|
||||||
|
req.user.Photos[0] != null &&
|
||||||
|
req.user.Photos[0].value != null
|
||||||
|
)
|
||||||
|
photo = req.user.Photos[0].value;
|
||||||
|
else
|
||||||
|
photo = '/static/media/buddy.403cb9f6.svg';
|
||||||
|
}
|
||||||
|
|
||||||
|
// const room = rooms.get(state.roomId);
|
||||||
|
|
||||||
|
io.sockets.socket(state.id).emit('notification',
|
||||||
|
{
|
||||||
|
method: 'auth',
|
||||||
|
data :
|
||||||
{
|
{
|
||||||
if (req.user.displayName != null)
|
|
||||||
displayName = req.user.displayName;
|
|
||||||
else
|
|
||||||
displayName = '';
|
|
||||||
|
|
||||||
if (
|
|
||||||
req.user.Photos != null &&
|
|
||||||
req.user.Photos[0] != null &&
|
|
||||||
req.user.Photos[0].value != null
|
|
||||||
)
|
|
||||||
photo = req.user.Photos[0].value;
|
|
||||||
else
|
|
||||||
photo = '/static/media/buddy.403cb9f6.svg';
|
|
||||||
}
|
|
||||||
|
|
||||||
const data =
|
|
||||||
{
|
|
||||||
peerId : state.peerId,
|
|
||||||
displayName : displayName,
|
displayName : displayName,
|
||||||
picture : photo
|
picture : photo
|
||||||
};
|
}
|
||||||
|
});
|
||||||
const room = rooms.get(state.roomId);
|
|
||||||
|
|
||||||
room.authCallback(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
res.send('');
|
res.send('');
|
||||||
}
|
}
|
||||||
|
|
@ -322,6 +328,13 @@ async function runWebSocketServer()
|
||||||
{
|
{
|
||||||
const io = require('socket.io')(httpsServer);
|
const io = require('socket.io')(httpsServer);
|
||||||
|
|
||||||
|
io.use(passportSocketIo.authorize({
|
||||||
|
secret : config.cookieSecret,
|
||||||
|
passport : passport,
|
||||||
|
cookieParser : cookieParser,
|
||||||
|
store : sessionStore,
|
||||||
|
}));
|
||||||
|
|
||||||
// Handle connections from clients.
|
// Handle connections from clients.
|
||||||
io.on('connection', (socket) =>
|
io.on('connection', (socket) =>
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue