Socket.io授权,“未找到授权标头”

时间:2014-10-23 20:56:48

标签: socket.io authorization

尝试向我的实时应用添加授权,我在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”从不打印。如果我删除授权部分,一切正常。我觉得这很直接......任何帮助都会很棒!

2 个答案:

答案 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()                   
    }
});