Auth0 和 Socket.IO - 正确的实现
Auth0 and Socket.IO - correct implementation
我正在努力通过 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 保护。我可以检查什么?
谢谢
var createToken = require('auth0-api-tokens')({
clientId: 'process.env.AUTH0_CLIENT_ID',
clientSecret: new Buffer(process.env.AUTH0_CLIENT_SECRET, 'base64'),
})
因为这是 运行 在客户端上(正如你的问题所暗示的),确保你已经在客户端上重新创建了 process.env
对象,以便它可以访问它,并找到你的环境变量。
对我来说,以下方法有效:
io.use(socketioJwt.authorize({
secret: new Buffer(process.env.AUTH0_CLIENT_SECRET, 'base64'),
handshake: true
}));
秘密和没有观众的握手。
我正在努力通过 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 保护。我可以检查什么?
谢谢
var createToken = require('auth0-api-tokens')({ clientId: 'process.env.AUTH0_CLIENT_ID', clientSecret: new Buffer(process.env.AUTH0_CLIENT_SECRET, 'base64'), })
因为这是 运行 在客户端上(正如你的问题所暗示的),确保你已经在客户端上重新创建了 process.env
对象,以便它可以访问它,并找到你的环境变量。
对我来说,以下方法有效:
io.use(socketioJwt.authorize({
secret: new Buffer(process.env.AUTH0_CLIENT_SECRET, 'base64'),
handshake: true
}));
秘密和没有观众的握手。