Comment puis-je authentifier une connexion socket.io? Mon application utilise un noeud final de connexion d'un autre serveur (python) pour obtenir un jeton. Comment puis-je utiliser ce jeton lorsqu'un utilisateur ouvre une connexion de socket côté nœud?
io.on('connection', function(socket) {
socket.on('message', function(message) {
io.emit('message', message);
});
});
Et le côté client:
var token = sessionStorage.token;
var socket = io.connect('http://localhost:3000', {
query: 'token=' + token
});
Si le jeton est créé en python:
token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')
Comment utiliser ce jeton pour authentifier une connexion de socket dans le nœud?
Peu importe que le jeton ait été créé sur un autre serveur. Vous pouvez toujours le vérifier si vous avez la bonne clé secrète et l'algorithme.
jsonwebtoken
client
var token = sessionStorage.token;
var socket = io.connect('http://localhost:3000', {
query: {token: token}
});
Serveur
var io = require('socket.io')();
var jwt = require('jsonwebtoken');
io.use(function(socket, next){
if (socket.handshake.query && socket.handshake.query.token){
jwt.verify(socket.handshake.query.token, 'SECRET_KEY', function(err, decoded) {
if(err) return next(new Error('Authentication error'));
socket.decoded = decoded;
next();
});
} else {
next(new Error('Authentication error'));
}
})
.on('connection', function(socket) {
// Connection now authenticated to receive further events
socket.on('message', function(message) {
io.emit('message', message);
});
});
socketio-jwt
moduleCe module facilite beaucoup l’authentification tant côté client que côté serveur. Il suffit de regarder leurs exemples.
client
var token = sessionStorage.token;
var socket = io.connect('http://localhost:3000');
socket.on('connect', function (socket) {
socket
.on('authenticated', function () {
//do other things
})
.emit('authenticate', {token: token}); //send the jwt
});
Serveur
var io = require('socket.io')();
var socketioJwt = require('socketio-jwt');
io.sockets
.on('connection', socketioJwt.authorize({
secret: 'SECRET_KEY',
timeout: 15000 // 15 seconds to send the authentication message
})).on('authenticated', function(socket) {
//this socket is authenticated, we are good to handle more events from it.
console.log('hello! ' + socket.decoded_token.name);
});