【问题标题】:Auth0 and Socket.IO - correct implementationAuth0 和 Socket.IO - 正确的实现
【发布时间】:2015-12-20 01:42:38
【问题描述】:

我正在使用 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 不会。我需要使用 Auth0 保护的 socket.io。我可以检查什么?

谢谢

【问题讨论】:

  • 客户端似乎能够生成一个有效的令牌。服务器只是不处理 socket.io 请求。必须弄清楚如何调试...

标签: javascript node.js socket.io auth0 feathersjs


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

由于这是在客户端上运行的(正如您的问题所暗示的那样),请确保您已在客户端上重新创建 process.env 对象,以便它可以访问它并找到您的环境变量。

【讨论】:

  • 感谢您的回答。你基本上和我做的一样,只是没有过期。我不认为我的令牌有问题,只是因为它有超时。事实上,令牌看起来不错。服务器端可能有问题。我只是还没弄清楚如何调试它。
【解决方案2】:

对我来说,以下工作:

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

没有观众的秘密和握手。

【讨论】:

    猜你喜欢
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 2021-06-24
    • 1970-01-01
    • 2010-10-05
    • 2010-10-15
    • 2018-02-10
    相关资源
    最近更新 更多