我想通过socket.io与angular和nodejs-express进行通信
验证用户身份验证的最佳方法是什么?
io.on('connection', function (socket) {
let jwt = socket.token;
//to Implement
let isAuth = authService.verifyToken(jwt);
if (!isAuth) {
socket.disconnect()
}
});
这是一个好方法吗?
答案 0 :(得分:0)
你可以将你的JWT放在一个HttpOnly Cookie中(它是raccomanded),
此cookie将由浏览器在第一个http / s连接中自动发送,
然后在服务器端你可以做:
这是设置cookie
_res.cookie('JWT', jwtBearerToken, { maxAge: expireMilliseconds, httpOnly: true})
然后
function async verifyToken(_socket: Socket, _next: NextFunction) {
let xsrfToken = _socket.handshake.headers['x-xsrf-token'];
var cookie = _socket.request.headers.cookie
if (_socket.request.headers.cookie && xsrfToken) {
let token = parseCookie(cookie);
let decodedJWT: any;
try {
//using jsonwebtoken library
decodedJWT = await
jwt.verify(token.JWT, this.RSA_PUBLIC_KEY, { algorithms: ['RS256'], });
} catch (err) {
//do something
return;
}
_next();
}
}
并在socket-server上“使用”此函数,如
io.use((socket, next) => this.verifyToken(socket,next));
答案 1 :(得分:0)
我找到了一种有用的方法,可以使用 socketio-jwt
var socketioJwt = require('socketio-jwt');
var io = socketIo.listen(server);
io.set('authorization', socketioJwt.authorize({
secret: 'YOUR-SECRET',
handshake: true
}));
并在正面:this.socket = io(URLS.BASE_URL,{
query: 'token=' + localStorage.getItem('my-token')
});
我们假设jwt令牌存储在本地存储中。