共计 2254 个字符,预计需要花费 6 分钟才能阅读完成。
痛点分析
在接口自动化测试中,Token 管理是个让人头疼的问题。特别是在多环境(开发、测试、预发布、生产)切换时,手动维护 Token 经常会导致以下问题:

- Token 失效导致测试中断:环境切换后忘记更新 Token,导致大量用例失败
- 维护成本高:每个接口都需要单独配置 Authorization 头,改动时需逐个更新
- 安全隐患:Token 明文写在接口文档或代码中,容易泄露
方案对比
目前主流的 Token 管理方案主要有三种,各有优劣:
- 环境变量
- 优点:配置简单,Apifox 原生支持
-
缺点:无法处理动态 Token(如需要定期刷新的 JWT)
-
预执行脚本
- 优点:灵活性高,可实现自动刷新
-
缺点:需要编写 JavaScript 代码
-
中间件拦截
- 优点:统一处理所有请求
- 缺点:架构复杂,不适合轻量级测试
对于大多数场景,环境变量 + 预执行脚本 的组合是最佳选择。
核心实现
环境变量配置
- 在 Apifox 中进入 ” 环境管理 ”
- 创建或编辑目标环境
- 添加变量如
ACCESS_TOKEN,值留空或填初始 Token - 在接口的 Headers 中引用变量:
Authorization: Bearer {{ACCESS_TOKEN}}
预请求脚本示例
// 获取当前环境变量
const token = pm.environment.get('ACCESS_TOKEN');
// 如果 Token 不存在或已过期,获取新 Token
if (!token || isTokenExpired(token)) {
pm.sendRequest({
url: 'https://api.example.com/auth',
method: 'POST',
header: {'Content-Type': 'application/json'},
body: {
mode: 'raw',
raw: JSON.stringify({username: pm.environment.get('AUTH_USER'),
password: pm.environment.get('AUTH_PWD')
})
}
}, function (err, res) {if (err) {console.error('获取 Token 失败:', err);
return;
}
const newToken = res.json().access_token;
pm.environment.set('ACCESS_TOKEN', newToken);
console.log('Token 已更新:', newToken);
});
}
// 简单 Token 过期检查(实际应根据 JWT 的 exp 字段)function isTokenExpired(token) {return false; // 这里实现你的过期逻辑}
生产级优化
Token 自动续期
通过响应头中的 Expires 字段实现自动续期:
// 在上面的请求回调中添加
const expires = new Date(res.headers.get('Expires'));
const now = new Date();
if (expires - now < 300000) { // 5 分钟内过期
scheduleTokenRefresh();}
敏感信息加密
使用 CryptoJS 加密存储密码:
// 加密
const encrypted = CryptoJS.AES.encrypt(pm.environment.get('RAW_PASSWORD'),
'your-secret-key'
).toString();
// 解密
const decrypted = CryptoJS.AES.decrypt(
encrypted,
'your-secret-key'
).toString(CryptoJS.enc.Utf8);
避坑指南
- 变量作用域未生效
- 确保在正确的环境中设置了变量
-
检查变量名拼写是否一致(区分大小写)
-
脚本执行顺序问题
- 预请求脚本会在接口调用前执行
-
如果有多个脚本,注意它们的执行顺序
-
Token 未正确传递
- 确保 Headers 中的 Authorization 字段格式正确
- 检查是否有其他中间件覆盖了你的 Header
验证环节
将 Postman 的 Collection 导入 Apifox 后:
- 在 Postman 中导出 Collection 时勾选 ” 包含 Token”
- 在 Apifox 中导入时选择 ” 保留认证信息 ”
- 创建一个测试用例验证 Token 是否生效:
pm.test("Token 验证通过", function() {pm.response.to.have.status(200);
pm.response.to.not.have.jsonBody('error');
});
时序图
sequenceDiagram
participant T as 测试用例
participant A as Apifox
participant S as 服务器
T->>A: 触发接口请求
A->>A: 执行预请求脚本
alt Token 有效
A->>S: 携带现有 Token 请求
else Token 无效 / 过期
A->>S: 请求新 Token
S-->>A: 返回新 Token
A->>A: 保存 Token 到环境变量
A->>S: 携带新 Token 重试请求
end
S-->>A: 返回接口响应
A-->>T: 返回测试结果
思考题
如何实现 OAuth2.0 的自动化 Token 轮换?可以考虑以下方向:
- 监听 401 状态码自动触发 refresh_token 流程
- 根据 expires_in 提前刷新 Token
- 使用互斥锁避免并发刷新
- 将 refresh_token 也加密存储
希望这篇指南能帮你解决 Token 管理的烦恼。在实际项目中,建议先从简单方案开始,再逐步引入自动续期等高级功能。
正文完
