使用Auth0和Socket.IO强制进行身份验证

4

我需要使用令牌认证保护由Feathers数据库适配器导出的服务。我们对REST进行了如下操作:

var authenticate = jwt({
  secret: new Buffer(process.env.AUTH0_CLIENT_SECRET, 'base64'),
  audience: process.env.AUTH0_CLIENT_ID
});

为了防止未经授权的客户端访问REST服务,我们要做以下操作:
app.use('/api', authenticate);

Websockets 的访问也应该受到限制。我找到了一些例子,下面的示例理论上应该可以为 socket.io 启用身份验证。

app.configure(feathers.socketio(function(io) {
  io.on('connection', socketioJwt.authorize({
    secret: new Buffer(process.env.AUTH0_CLIENT_SECRET, 'base64'),
    audience: process.env.AUTH0_CLIENT_ID,
    timeout: 5000 // 5 seconds to send the authentication message
  })).on('authenticated', function(socket) {
//    console.log('token: ' + socket.decoded_token.name);
    socket.emit('news', { hello: 'world' });
    socket.on('my other event', function (data) {
      console.log(data);
    });
  });
}));

然而事实并非如此。客户端的socket.io请求没有令牌,但服务器可以处理它们。

我应该从哪里开始查找?

2个回答

1
最好的强制认证方式是使用feathers-hooks。我们还有一份关于如何进行身份验证授权的指南。
我们的文档目前有点混乱,很容易被忽略,但我们将很快解决这个问题!

我理解你的意思是推荐的方式是利用passport-auth0等等吗?当你配置应用程序使用feathers-passport后,'rest'和'socketio'以及hooks,是否都需要身份验证?这些app.configure是否足以创建适当的“堆栈”?我不知道你的文档是否令人困惑。我已经做了两个星期的Node.JS。包的丰富仍然让人不知所措。我想出了一种强制socket.io请求进行身份验证的方法,但还没有让我的客户端和服务器愉快地玩在一起。 - Moshe Shmukler

0

我可能找到了问题所在。当我使用下面的代码片段[在io.on()之前]来锁定socket.io时,它似乎可以工作。

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

现在,我需要想办法让客户端和服务器友好地协作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接