angular - 如何在通过 socket.io 的通信中使用 jwtToken?
问题描述
我想通过 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()
}
});
这是一个好方法吗?
解决方案
你可以把你的 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();
}
}
并在套接字服务器上“使用”此功能,例如
io.use((socket, next) => this.verifyToken(socket,next));
推荐阅读
- javascript - Exceljs锁定单元格创建空行
- php - 移动到另一台服务器后,wordpress 出现奇怪的错误
- javascript - Twitter API:警告:无法对未安装的组件执行 React 状态更新
- apache-flink - Flink ValueState“向 RocksDB 添加数据时出错”
- mysql - 如何在单行中对具有多个数据集的数据进行排序?
- java - 如何将大数字转换为 ZonedDateTime java 字段
- java - Spring Boot Security 无法正常工作
- mysql-workbench - 为什么我在 mysql 中调用过程时得到空值?
- bridge - Apache ActiveMQ Artemis 服务器上的核心网桥是否可以在同一源服务器和目标服务器之间配置
- java - 英里转换为公里