2015-09-05 87 views
0

如何將自定義登錄令牌傳遞給io連接?如何將用戶的登錄令牌傳遞給socket.io?

所以基本上我以後有認證用戶,用戶將有令牌,但我怎麼傳遞令牌socket.io連接,並可能使用它。

下面的代碼 - 這是api.js

function ensureAuthenticated(req, res, next) { 
    // I skip alot of codes for clarity 
    var token = req.body.token || req.query.token || req.headers['x-access-token']; 

    if (token) { 
     req.user = user; 
     return next(); 
    } 
} 
//Login 
router.post('/login', function(req, res) { 
     // I skip the mongoose part for clarity 
     var token = createToken(user); 

     res.json({ 
      success: true, 
      message: "Successfully login", 
      token: token 
     }); 
}); 

,而這是在server.js

io.on('connection', function(socket) { 

    socket.broadcast.emit('user joined', { 
    username: socket.username, 
    numUsers: numUsers 
    }); 

    socket.on('typing', function() { 
    socket.broadcast.emit('typing', { 
     username: socket.username 
    }); 
    }); 

socket.on('online', function() { 
    socket.emit('online'); 
    }); 

    socket.on('chat', function(msg) { 
    console.log("message: " + msg); 
    io.emit('chat', msg); 
    }); 

}); 

正如你可以看到,如果我要設置用戶名對象,我有要做username: socket.username,要使用用戶名對象。

如果我這樣做用戶名:req.user,它會返回錯誤。我是否必須在io.on('connection')中設置ensureAuthenticated函數才能夠使用它?

回答

0

在任何傳入套接字的消息,您可以訪問存在的餅乾當插座通過第一次連接:

socket.request.headers.cookie 

因此,如果您的用戶登錄標記是一個cookie,你可以把它拿來那裏有任何連接的socket.io插座。


您可以在連接時使用socket.io中間件也做插座認證,如下所示:在socket.io DOC hereAuthentication with Node/Express/Socket.IO

示例代碼。

var io = require('socket.io')(); 
io.use(function(socket, next){ 
    if (socket.request.headers.cookie) return next(); 
    next(new Error('Authentication error')); 
}); 
相關問題