Flutter请求Keycloak获取token报XMLHttpRequest错误但Postman正常如何解决
问题原因
你遇到的是浏览器**CORS(跨域资源共享)**限制导致的错误:
- Postman属于桌面客户端,不受浏览器同源策略约束,所以请求可以正常执行
- Flutter Web运行在浏览器环境时,所有跨域请求都会被浏览器自动校验CORS头,Keycloak默认没有允许你前端所在的域名(你这里是
http://localhost:57146)跨域访问,所以浏览器直接拦截了请求,抛出XMLHttpRequestError。
解决方法
1. 开发阶段临时绕过(仅本地调试用)
如果只是本地开发测试,可以启动Flutter Web时禁用浏览器CORS校验:
Windows端执行:
flutter run -d chrome --web-browser-flag "--disable-web-security"
Mac端执行:
open -n -a "Google Chrome" --args --user-data-dir=/tmp/temp_chrome_user_data_dir --disable-web-security
然后在打开的Chrome窗口里运行你的Flutter Web应用即可。
2. Keycloak端配置CORS(推荐通用方案)
直接在Keycloak的管理后台配置允许跨域的域名:
- 登录Keycloak管理控制台,进入你对应的Realm(这里是
PiattaformaPrenotazioni) - 找到你配置的客户端
myclient,进入设置页 - 找到
Web Origins配置项,添加你前端的访问地址,本地开发可以填*临时允许所有来源,生产环境要填你实际的前端域名 - 保存配置后重启Keycloak即可生效。
3. 代码修正提示
你当前的makeTokenRequest方法没有返回响应结果,需要补充返回值逻辑才能正确拿到token:
Future<String> makeTokenRequest(String url,Map<String,String>params) async { try { print("arrivato in _restManager"); var result = await post(url, body: params); print(result.toString()); return result.body; // 补充返回响应内容 }catch(e){ throw e; } }
生产环境不要禁用浏览器CORS,也不要在Keycloak里配置
*作为允许来源,会有安全风险。
内容的提问来源于stack exchange,提问作者Zio White
相关产品推荐
相关产品推荐

