前言
当前是重构之前的项目:未走OAuth标准登录,通过用户硬编码登录;
docker中的nginx,为映射到宿主机上
项目场景
创建企业微信第三方应用,采用 OAuth2.0 授权码模式的标准行为:code是一次性的。
补充:同时 code 也是有时效性的。
问题描述
访问自定义企业微信第三方应用,“ 授权的code显示失败 ”。
使用抓包工具,获取用户信息身份的接口返回 errcode:50001,表示 redirect_uri unauthorized
原因分析
1. 先确认企业微信管理后台对应的应用,是否设置了网页授权及JS-SDK的可信域名
2. 思考:redirect_uri 是前端登录跳转时才用到的参数,为什么后端接口会报错?
关联Code:接口使用的 code 来自前端登录时生成的。
问题定位1:code的获取,即微信后台配置的可信配置域名和实际OAuth的redirect_uri间的匹配
3. 监控微信验证请求18006
# server块,放在 location /prod-api 之前 access_log /var/log/nginx/18002.access.log combined; error log /var/log/nginx/18002.error.log notice; location = /可信域名验证文件.txt { default_type text/plain; return 200 "文件内容"; }- 通过日志access.log、error.log 监控微信验证请求的访问记录:
途径一:默认日志
途径二:自定义日志 - 相关测试命令
结果:日志没有任何内容。说明微信验证机器人未走18006端口,可能走标准端口80 # 请求验证文件命令 curl -I http://ip:18006/可信域名验证文件.txt # 查看请求日志命令 tail -f /var/log/nginx/18006.access.log | grep -i "ww_verify"
4. 监控微信验证请求80
80端口的验证文件配置完成且可正常访问后,再次测试接口,发现50001错误依然存在。
- 排查路线出现分叉
| 问题 | 关键点 |
| 可信域名的配置 是否 应带端口号 | 使用非标准端口时,微信要求可信域名必须带端口号,不能只填裸域名 |
| 微信后台反复修改域名 | 测试结果相同:不通过 |
| 80端口配置出现问题 | 排查配置引起的冲突导致nginx重启失败问题 |
关键转折
验证可信域名流程如下:
获取access_token -> 寻找企业微信应用 -> code会携带redirect_uri -> 验证应用中的可信域名列表
问题定位2:获取access_token阶段可能存在问题,即生产环境程序包的secret凭证错误
解决方案
更新后端中 secret 硬编码为新应用的凭证
快速验证
# 步骤1: 测试新 secret 能否拿到 token curl "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=<xxxx>&corpsecret=<应用的secret>" # 步骤2: 用拿到的 token + code 测试 getuserinfo curl "https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token=<TOKEN>&code=<CODE>"如果测试 getuserInfo 的数据传输,返回60020:说明新Agent的IP白名单不含当前服务器 IP
修复:在企业可信IP配置项中添加服务器的IP
辅助Linux命令
# 解压到临时目录;检查class文件中的字符串【strings 从二进制文件中提取所有可读字符串】 cd /tmp && jar xf /path/xxx.jar BOOT-INF/classes/ && \ strings BOOT-INF/classes/path/yyy.class | grep -i "secret\|1QEQDC\|Hjtmck"