Dart中SignalR Token认证遇302错误,求解决方法
解决SignalR HubConnection启动302错误及Token使用问题
一、先排查302错误的核心原因
302是重定向响应,说明你的Hub地址请求被服务器重定向到了其他地址,优先解决这个问题:
- 确认Hub地址正确性:检查
http://*****/hub是否是服务器端SignalR Hub的有效端点,部分服务器会自动重定向到带斜杠后缀(如/hub/)或HTTPS地址,直接使用最终目标地址尝试。 - 开启重定向跟随:默认SignalR的HttpConnection不会自动跟随重定向,可在配置中开启:
final httpConnectionOptions = HttpConnectionOptions( accessTokenFactory: () => getToken().then((value) => value.token ?? ''), followRedirects: true, // 允许跟随重定向 maxRedirects: 5, // 限制最大重定向次数,避免循环 ); - 检查服务器CORS配置:如果服务器未允许客户端域名的跨域请求,也可能触发异常,确保服务器端CORS规则允许SignalR所需的HTTP方法(GET、POST、OPTIONS等)及自定义请求头。
二、其他在SignalR中添加Token的方式
如果accessTokenFactory方式仍有问题,可尝试以下两种方案:
1. 直接在请求头中注入Token
手动构建包含Bearer Token的请求头,需确保Token获取操作在初始化配置前完成:
Future<List> fetchLists() async { // 先获取Token Auth auth = await getToken(); final httpConnectionOptions = HttpConnectionOptions( headers: { 'Authorization': 'Bearer ${auth.token ?? ''}', }, followRedirects: true, ); final hubConnection = HubConnectionBuilder() .withUrl('http://*****/hub', options: httpConnectionOptions) .build(); await hubConnection.start(); // 后续业务逻辑 }
2. 通过QueryString传递Token(不推荐)
仅在服务器强制要求时使用此方式,Token会暴露在URL中,安全性较低:
Future<List> fetchLists() async { Auth auth = await getToken(); // 拼接Token到Query参数 final hubUrl = Uri.parse('http://*****/hub').replace( queryParameters: {'access_token': auth.token ?? ''}, ); final hubConnection = HubConnectionBuilder() .withUrl(hubUrl.toString()) .build(); await hubConnection.start(); // 后续业务逻辑 }
三、额外排查点
- 验证Token有效性:用Postman等工具直接请求Hub地址,带上
Authorization: Bearer {你的Token}头,确认服务器返回正常响应,排除Token过期、权限不足等问题。 - 检查服务器端认证配置:确保服务器端SignalR已正确配置JWT认证,Token的签名算法、受众(Audience)、颁发者(Issuer)与服务器配置完全匹配。
内容的提问来源于stack exchange,提问作者user16357470
相关产品推荐
相关产品推荐

