尝试向我的实时应用添加授权,我在Chrome控制台中收到此消息:
socket.io-parser decoded 4{"message":"No Authorization header was found","code":"credentials_required", "type":"UnauthorizedError"}
这是我的代码(我使用angular-fullstack):
socket.service.js(客户端)
'use strict';
angular.module('smthing')
.factory('socket', function(socketFactory, Auth) {
var ioSocket = io(null, {
//Auth.getToken() returns $cookieStore.get('token') from angular auth.service.js
'query': 'token=' + Auth.getToken()
});
...
socketio.js(服务器端)
socketio.use(require('socketio-jwt').authorize({
secret: 'smthing',
handshake: true
}));
socketio.on('connection', function (socket) {
console.log('smthing');
...
“smthing”从不打印。如果我删除授权部分,一切正常。我觉得这很直接......任何帮助都会很棒!
答案 0 :(得分:1)
我能够在自己的环境中解决这个问题。我使用这个片段,但在解决根问题之前我遇到了问题。
io.set('authorization', socketioJwt.authorize({
secret: jwtSecret,
handshake: true
}));
根本问题是 socketio-jwt 所需的token
未添加到请求query
。如果你检查 socketio-jwt / lib / index.js ,你会看到一些代码:
//get the token from query string
if (req._query && req._query.token) {
token = req._query.token;
}
else if (req.query && req.query.token) {
token = req.query.token;
}
这意味着您应该能够在此处记录query
和_query
的值,并查看您的令牌。
如果不能,则必须确保在socket.io客户端中将令牌设置为查询。典型的方法是将其添加到connectParams
。
在iOS / Swift客户端中,如下所示:
self.socket = [[SocketIOClient alloc] initWithSocketURL:@"localhost:8091"
options:@{
@"connectParams" : @{@"token" : <my_token>}
}];
答案 1 :(得分:-1)
实际上是正确的语法:
var ioSocket = io(null, {
query: {
token: Auth.getToken()
}
});