2015-12-18 5 views
0

Я работаю над обеспечением сервисов socket.io с аутентификацией Auth0. На сервере я сделал ниже:Auth0 и Socket.IO - правильная реализация

app.configure(feathers.socketio(function(io) { 
    if(process.env.JWT_AUTH == 'disable' && app.get('env') !== 'production') { 
    console.log('*** JWT_AUTH disabled: Free passes today ***'); 
    } else { 
    io.use(socketioJwt.authorize({ 
     secret: new Buffer(process.env.AUTH0_CLIENT_SECRET, 'base64'), 
     audience: process.env.AUTH0_CLIENT_ID, 
     handshake: true 
    })); 
    } 
    io.on('connection', function(socket) { 
    socket.emit('news', { hello: 'world' }); 
    socket.on('my other event', function (data) { 
     console.log(data); 
    }); 
    }); 
})); 

Для того, чтобы передать маркер с Socket.io от клиента, я:

var io = require('socket.io-client'); 
var TOKEN_EXPIRATION_IN_SECONDS = 3600; 

var createToken = require('auth0-api-tokens')({ 
    clientId: 'process.env.AUTH0_CLIENT_ID', 
    clientSecret: new Buffer(process.env.AUTH0_CLIENT_SECRET, 'base64'), 
}) 

// each key is an entity, each array element is an action 
var token = createToken({ 
    scopes: { 
    users: ['read', 'update'], 
    clients: ['delete'] 
    }, 
    lifetimeInSeconds: TOKEN_EXPIRATION_IN_SECONDS 
}); 

console.log("Auth0 token: ", token); 

var socket = io.connect('http://127.0.0.1:8000', { 
    'query': 'token=' + token}); 
var app = feathers().configure(feathers.socketio(socket)); 

Я не используя лексем областей, но я скопировал их из примера. Вероятно, это не проблема.

Когда я включаю JWT_AUTH, сервер прекращает обслуживание несанкционированных [а также разрешенных] запросов socket.io. Без него мой REST API защищен, но socket.io - нет. Мне нужен socket.io, защищенный с помощью Auth0. Что я могу проверить?

Спасибо

+0

Похоже, что клиент может создать действительный токен. Сервер просто не обрабатывает запросы socket.io. Нужно выяснить, как отладить это ... –

ответ

0

Для меня ниже работал:

io.use(socketioJwt.authorize({ 
    secret: new Buffer(process.env.AUTH0_CLIENT_SECRET, 'base64'), 
    handshake: true 
})); 

секрет и рукопожатие без зрителей.

1
var createToken = require('auth0-api-tokens')({ 
    clientId: 'process.env.AUTH0_CLIENT_ID', 
    clientSecret: new Buffer(process.env.AUTH0_CLIENT_SECRET, 'base64'), 
}) 

Так как это работает на стороне клиента (как подсказывает ваш вопрос), убедитесь, что вы заново создали process.env объект на стороне клиента, чтобы он мог получить доступ к нему, и найдите свои переменные среды.

+0

Спасибо за ответ. Вы в основном делаете то же самое, что и я, кроме истечения срока действия. Я не думаю, что была проблема с моим токеном, потому что у него был тайм-аут. Фактически, токен выглядит хорошо. Возможно, что-то не так с концом сервера. Я просто не понял, как его отладить. –