Leo*_*Leo 7 socket.io jwt sails.js express-jwt
我已经实现了一个AngularJS应用程序,使用sails.io.js通过websockets与Sails后端进行通信.
由于后端基本上是一个纯API,并且也将连接到其他应用程序,我试图完全禁用会话并使用JWT.
我已经设置了express-jwt并且可以非常好地使用常规HTTP请求,但是当我通过sails.io.js发送请求时,什么都没发生 - websocket请求在客户端上保持挂起状态,并且服务器上没有任何事情发生( "愚蠢"的日志级别).
我已经尝试修补sails.io.js以支持查询参数,并且在连接时,我从Angular发送令牌,但在最好的情况下,我得到一个响应,其中来自express-jwt的错误消息说缺少凭据. ..
我也看到了一些提示,说明在socket中需要使用beforeConnect修改socket.js,我已经看过socketio-jwt,但是在Sails中不知道在哪里以及如何插入它.
有没有人实现过这个并且正在使用带有Sails和套接字的JWT?我会欣赏任何方向的暗示:)
我意识到我已经实施的政策和使用express-jwt的政策离我太多了,所以我没弄清楚究竟发生了什么.一旦我查看了其他示例,我就发现我只需要检查websocket请求与常规请求的不同之处,并且我很快就找到了解决问题的方法.
所以:
在sails策略中,检查令牌的所有组合,包括req.socket.handshake.query,如下所示:
module.exports = function (req, res, next) {
var token;
if (req.headers && req.headers.authorization) {
var parts = req.headers.authorization.split(' ');
if (parts.length == 2) {
var scheme = parts[0],
credentials = parts[1];
if (/^Bearer$/i.test(scheme)) {
token = credentials;
}
} else {
return res.json(401, {err: 'Format is Authorization: Bearer [token]'});
}
} else if (req.param('token')) {
token = req.param('token');
// We delete the token from param to not mess with blueprints
delete req.query.token;
}
// If connection from socket
else if (req.socket && req.socket.handshake && req.socket.handshake.query && req.socket.handshake.query.token) {
token = req.socket.handshake.query.token;
} else {
sails.log(req.socket.handshake);
return res.json(401, {err: 'No Authorization header was found'});
}
JWTService.verifyToken(token, function (err, token) {
if (err) {
return res.json(401, {err: 'The token is not valid'});
}
sails.log('Token valid');
req.token = token;
return next();
});
};
Run Code Online (Sandbox Code Playgroud)它运作良好!:)
| 归档时间: |
|
| 查看次数: |
1763 次 |
| 最近记录: |