{“msg“:“请求访问:/xxx-api/xxx/xxx/list,认证失败,无法访问系统资源“,“code“:401}
钉钉小程序对接若依后台时,访问报错如下,即可开始后续开发流程:
{"msg":"请求访问:/xxx-api/xxx/xxx/list,认证失败,无法访问系统资源","code":401}
浏览器返回code:401 认证失败,说明两点:
- 网络完全通了:地址、端口、上下文
/xxx-api全部正确,后端能收到请求并返回校验结果; - 工单接口需要携带
Authorization: Bearer token请求头,浏览器直接访问没带 token,所以 401;小程序现在的问题是免登流程没拿到有效 token,根本没走到工单请求。
一、401 含义与流程梳理
完整执行链路:
- 小程序打开 → 调用
dd.getAuthCode获取钉钉授权码 - 请求
/xxx-api/xxx/xxx/login提交 authCode,后端返回 token - 把 token 存入缓存,再携带
Authorization头部请求/smz/work/list你现在浏览器直接访问工单接口没带 token,必然 401;小程序卡在第 1/2 步免登环节,没拿到 token,不会发起工单请求,后端看不到工单接口日志。
二、模拟器核心坑(最主要原因)
钉钉开发者工具模拟器中,dd.getAuthCode无法获取有效 authCode,会直接进入 fail 回调,Promise 不会 resolve,后续工单请求永远不执行。
解决:必须用手机真机扫码预览调试
- 右上角点「预览」生成二维码;
- 手机连接你电脑同 WiFi(192.168.x.*),钉钉扫码打开小程序;
- 真机环境才能正常拿到 authCode、请求登录接口、生成 token,再拉取工单。
三、检查免登接口逻辑(utils/login.js)
1. 免登接口地址核对
url: "http://192.168.x.xxx:xxxx/dev-xxx/xxx/xxx/login"浏览器访问这个地址测试:http://192.168.x.xx:xxxx/dev-xxx/xxx/xxx/loginPOST 方式传{authCode: "随便字符串"},正常会返回登录失败 / 有效 token,不会 401(登录接口放行,不需要 token)。
2. 补全异常捕获,定位卡死位置
修改login.js,增加 fail 捕获:
export function getRuoyiToken() { return new Promise((resolve,reject) => { dd.getAuthCode({ success: async (res) => { const authCode = res.authCode; dd.httpRequest({ url: "http://192.168.x.xx:xxxx/dev-xxx/xxx/xxx/login", method: "POST", data: { authCode }, success: (loginRes) => { const data = loginRes.data; if(data.code === 200){ dd.setStorageSync("ruoyi_token", data.token); resolve(data.token); }else{ reject("钉钉登录校验失败:" + data.msg); } }, fail:(err)=>{ reject("请求登录接口网络失败:"+JSON.stringify(err)); } }) }, fail:(err)=>{ // 模拟器一定会进这里,拿不到authCode reject("获取钉钉授权码失败:"+JSON.stringify(err)); } }) }) }3. workList.js 增加弹窗打印,看阻塞在哪
async initLogin(){ dd.showModal({content:"开始执行免登流程"}); try{ const token = await getRuoyiToken(); dd.showModal({content:"获取token成功:"+token}); this.setData({token}); this.getWorkData(true); }catch(e){ dd.showModal({content:"免登失败原因:"+e}); } }真机打开后会弹窗提示:
- 提示「获取钉钉授权码失败」:模拟器限制,真机可解决;
- 提示「钉钉登录校验失败」:钉钉 AppKey/AppSecret 配置错误,后端校验不通过;
- 打印出 token 字符串:免登成功,后端会收到工单请求。
四、工单请求头确认(拿到 token 后才会携带)
workList.js里工单请求 header 是正确的:
header:{Authorization:"Bearer "+this.data.token}只有免登成功赋值 token 后,这个 header 才会带上,否则为空,访问工单接口直接 401。
五、分步操作流程
- 确认后端
application-dev.yml已添加address:0.0.0.0,服务重启完成; - 开发者工具勾选全部 3 条忽略域名校验,编译项目;
- 手机连本机同 WiFi,点右上角「预览」扫码真机打开;
- 观察弹窗提示,定位免登失败原因;
- 若弹窗打印出 token,后端控制台会收到
/smz/work/list请求,页面加载工单数据。
注意
浏览器直接访问工单接口没有携带登录 token,401 是正常安全拦截,不代表地址错误,只证明接口鉴权生效;真正的问题是小程序没走完登录拿 token 流程。
