Genexus智能设备网格更新记录测试环境报Unauthorized错误
Genexus 16U11 安卓端改删操作报未授权问题排查
问题基本信息
- 开发环境:Genexus 16U11,安卓端数据网格基于Work With Smart Device组件搭建
- 异常表现:
- 记录插入功能全环境正常,仅测试服务器环境下,确认执行记录删除/更新操作后直接返回*Unauthorized(未授权)*错误,无其他额外提示
- 本地开发环境、生产服务器环境改删功能完全正常
- 前期已做排查:
- 开启client.log调试功能后,日志文件始终为空无输出
- 通过Android Studio Logcat工具抓取运行日志,核心报错栈如下:
2022-06-24 12:19:46.028 4745-4893/com.artech.rts.fotointerventi W/DefaultRequestDirector: Authentication error: Unable to respond to any of these challenges: {} 2022-06-24 12:19:46.031 4745-4893/com.artech.rts.fotointerventi W/System.err: org.json.JSONException: Value <!DOCTYPE of type java.lang.String cannot be converted to JSONArray 2022-06-24 12:19:46.032 4745-4893/com.artech.rts.fotointerventi W/System.err: at org.json.JSON.typeMismatch(JSON.java:111) 2022-06-24 12:19:46.033 4745-4893/com.artech.rts.fotointerventi W/System.err: at org.json.JSONArray.<init>(JSONArray.java:96) 2022-06-24 12:19:46.033 4745-4893/com.artech.rts.fotointerventi W/System.err: at org.json.JSONArray.<init>(JSONArray.java:108) 2022-06-24 12:19:46.033 4745-4893/com.artech.rts.fotointerventi W/System.err: at com.artech.common.ServiceErrorParser.parseBody(ServiceErrorParser.java:74) 2022-06-24 12:19:46.033 4745-4893/com.artech.rts.fotointerventi W/System.err: at com.artech.common.ServiceErrorParser.parse(ServiceErrorParser.java:38) 2022-06-24 12:19:46.036 4745-4893/com.artech.rts.fotointerventi W/System.err: at com.artech.common.ServiceHelper.responseToServiceResponse(ServiceHelper.java:484) 2022-06-24 12:19:46.036 4745-4893/com.artech.rts.fotointerventi W/System.err: at com.artech.common.ServiceHelper.doServerRequest(ServiceHelper.java:469) 2022-06-24 12:19:46.036 4745-4893/com.artech.rts.fotointerventi W/System.err: at com.artech.common.ServiceHelper.doServerRequest(ServiceHelper.java:440) 2022-06-24 12:19:46.037 4745-4893/com.artech.rts.fotointerventi W/System.err: at com.artech.common.ServiceHelper.putJson(ServiceHelper.java:432) 2022-06-24 12:19:46.037 4745-4893/com.artech.rts.fotointerventi W/System.err: at com.artech.common.ServiceHelper.updateEntityData(ServiceHelper.java:258) 2022-06-24 12:19:46.037 4745-4893/com.artech.rts.fotointerventi W/System.err: at com.artech.layers.RemoteBusinessComponent.callService(RemoteBusinessComponent.java:194) 2022-06-24 12:19:46.037 4745-4893/com.artech.rts.fotointerventi W/System.err: at com.artech.layers.RemoteBusinessComponent.save(RemoteBusinessComponent.java:76) 2022-06-24 12:19:46.037 4745-4893/com.artech.rts.fotointerventi W/System.err: at com.artech.fragments.LayoutFragmentEditBC$SaveActionTask.saveBCAndMedia(LayoutFragmentEditBC.java:160) 2022-06-24 12:19:46.037 4745-4893/com.artech.rts.fotointerventi W/System.err: at com.artech.fragments.LayoutFragmentEditBC$SaveActionTask.doInBackground(LayoutFragmentEditBC.java:142) 2022-06-24 12:19:46.038 4745-4893/com.artech.rts.fotointerventi W/System.err: at com.artech.fragments.LayoutFragmentEditBC$SaveActionTask.doInBackground(LayoutFragmentEditBC.java:69) 2022-06-24 12:19:46.038 4745-4893/com.artech.rts.fotointerventi W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:333) 2022-06-24 12:19:46.038 4745-4893/com.artech.rts.fotointerventi W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:266) 2022-06-24 12:19:46.038 4745-4893/com.artech.rts.fotointerventi W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 2022-06-24 12:19:46.038 4745-4893/com.artech.rts.fotointerventi W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 2022-06-24 12:19:46.039 4745-4893/com.artech.rts.fotointerventi W/System.err: at java.lang.Thread.run(Thread.java:764)
故障根因分析
从日志可以直接拆解出两个核心信息,此前认为两台服务器配置一致的判断存在遗漏:
- 首行鉴权错误说明改删请求根本没走到Genexus业务逻辑层,在测试服务器的前置接入层就被401拦截了
- 后续JSON解析错误是连锁反应:接入层拦截请求后返回的是HTML格式的401错误页(
<!DOCTYPE是HTML文档的标准开头标识),但Genexus客户端默认按JSON格式解析接口响应,直接抛出类型转换异常,把真实的拦截原因吞掉,最终只显示笼统的未授权提示。
具体排查点
按优先级从高到低核对:
- 第一优先级检查测试服务器Web接入层(IIS/Nginx/Apache、反向代理、WAF)的HTTP方法授权规则:Genexus SD应用的插入操作走POST请求,更新走PUT、删除走DELETE。绝大多数同类问题都是测试环境接入层默认只放开了GET/POST方法的鉴权白名单,PUT/DELETE请求被全局拦截规则直接拦截,刚好匹配插入正常、改删报错的表现。生产环境因为历史配置已经放开全方法权限所以运行正常,测试环境部署时漏配了这条规则。
- 第二优先级核对Genexus BC(Business Component)接口路由的权限配置:改删操作调用的是
RemoteBusinessComponent的save/delete接口,和插入接口路由不同,检查测试环境对应路由的身份验证规则是否和生产一致,有没有开启Windows集成鉴权、IP白名单拦截、路径级别的权限控制。 - 第三优先级检查CSRF防护、跨域规则:部分WAF或Web框架的CSRF防护默认会拦截带自定义鉴权头的PUT/DELETE请求,POST请求因为符合表单提交规则被直接放行,也会出现同类现象。
- 快速验证方式:在测试服务器接入层抓包,直接查看PUT/DELETE请求返回的完整HTML内容,页面里会明确标注是被哪条拦截规则阻断,不需要逐行对比配置。
内容的提问来源于stack exchange,提问作者Nicola
相关产品推荐
相关产品推荐

