Nativescript SocketIO v4配置extraHeaders丢失无法完成用户鉴权求助
解决方案
该问题是@triniwiz/nativescript-socketio v5.0.0底层Android端SocketIO Java客户端的已知行为:默认仅HTTP长轮询握手阶段会携带extraHeaders,如果直接使用WebSocket传输协议,自定义请求头会被丢弃。可按以下方案解决:
方案1:保留长轮询降级机制
优先使用HTTP长轮询完成握手,再升级到WebSocket协议,此时握手阶段携带的extraHeaders会被服务端正常识别,修改客户端配置即可:
SocketIOModule.forRoot('http://10.0.2.2:3000', { debug: true, log: true, // 必须先轮询再切WebSocket transports: ['polling', 'websocket'], extraHeaders: { 'authorization': `Bearer ${getString('ACCESS_TOKEN')}` }, }),
方案2:使用SocketIO标准auth配置传递鉴权信息
如果需要强制使用纯WebSocket连接,建议改用SocketIO v4原生支持的auth配置项传递token,避免自定义头丢失问题:
客户端配置
SocketIOModule.forRoot('http://10.0.2.2:3000', { debug: true, log: true, transports: ['websocket'], auth: { token: getString('ACCESS_TOKEN') } }),
服务端鉴权逻辑调整
io.use((socket, next) => { const token = socket.handshake.auth?.token; if (!token) return next(new Error('Authorization failed')); // 执行token校验逻辑 next(); });
其他补充说明
Chrome DevTools无法捕获Nativescript Android端的WebSocket请求是正常现象,若需要抓包验证,可以给安卓模拟器设置全局代理,用Charles、Fiddler等工具捕获完整请求。
如果上述方案都不满足需求,可以升级@triniwiz/nativescript-socketio到v6.0.0及以上版本,该版本已经修复了Android端WebSocket自定义头丢失的问题。
内容的提问来源于stack exchange,提问作者Shidomaru NeveRage
相关产品推荐
相关产品推荐

