共计 3520 个字符,预计需要花费 9 分钟才能阅读完成。
项目加了鉴权以后,调试会变得比较麻烦,因为 token 随时可能失效,每次都要手动调用登录接口重新设置 token 比较麻烦。
好在大部分接口调试工具都可以配置前置脚本,比如在 postman 和 apifox 中可以设置如下前置脚本进行 token 的获取,设置为环境变量 ACCESS_TOKEN
,然后在 Auth 引用变量即可。
相关环境变量,这里设置的是每个环境自己的环境变量,而不是全局变量。
以下为本人在具体项目中根据官方示例修改过的脚本,具体链接:https://apifox.com/help/best-practices/how-to-handle-auth
// 这里存在token失效的可能,所以调用一个需要token的接口来检查,检查失败则重新设置token | |
function accessTokenCheck(accessToken){ | |
const baseUrl = pm.environment.get("SYSTEM_BASEURL"); | |
const checkRequest = { | |
url: baseUrl + "/auth/current/user", | |
method: "POST", | |
// 这里根据自己需要 | |
header: { | |
"Authorization": "Bearer " + accessToken | |
} | |
}; | |
pm.sendRequest(checkRequest, function(err, res) { | |
if (err) { | |
console.log(err); | |
} else { | |
const jsonData = res.json(); | |
if(jsonData.code != 200){ | |
console.log("token失效,重新获取token"); | |
sendLoginRequest(); | |
} | |
} | |
}); | |
} | |
function sendLoginRequest() { | |
// 获取系统服务的Url地址,如果只是通过官方获取前置url有可能请求不到获取token接口 | |
const baseUrl = pm.environment.get("SYSTEM_BASEURL"); | |
// 登录用户名,这里从环境变量 LOGIN_USERNAME 获取,也可以写死(但是不建议) | |
const username = pm.environment.get("LOGIN_USERNAME"); | |
// 登录密码,这里从环境变量 LOGIN_PASSWORD 获取,也可以写死(但是不建议) | |
const password = pm.environment.get("LOGIN_PASSWORD"); | |
// 构造一个 POST 请求 | |
const loginRequest = { | |
url: baseUrl + "/auth/login", | |
method: "POST", | |
header: { | |
"Content-Type": "application/json" | |
}, | |
body: { | |
mode: 'raw', // 此处为 raw | |
raw: JSON.stringify({ | |
"username": username, | |
"password": password | |
}), // 序列化后的 json 字符串 | |
} | |
}; | |
// 请求成功则设置token | |
pm.sendRequest(loginRequest, function(err, res) { | |
if (err) { | |
console.log(err); | |
} else { | |
const jsonData = res.json(); | |
// 将 accessToken 写入环境变量 ACCESS_TOKEN | |
if (jsonData.data && jsonData.data.access_token) { | |
pm.environment.set("ACCESS_TOKEN", jsonData.data.access_token); | |
} else { | |
console.log("Access token 不存在"); | |
} | |
} | |
}); | |
} | |
// 获取环境变量里的 ACCESS_TOKEN | |
const accessToken = pm.environment.get("ACCESS_TOKEN"); | |
// 开始校验 | |
accessTokenCheck(accessToken); |
官方示例:
// 定义发送登录接口请求方法 | |
function sendLoginRequest() { | |
// 获取环境里的 前置 URL | |
const baseUrl = pm.request.getBaseUrl(); | |
// 登录用户名,这里从环境变量 LOGIN_USERNAME 获取,也可以写死(但是不建议) | |
const username = pm.environment.get("LOGIN_USERNAME"); | |
// 登录密码,这里从环境变量 LOGIN_PASSWORD 获取,也可以写死(但是不建议) | |
const password = pm.environment.get("LOGIN_PASSWORD"); | |
// 构造一个 POST x-www-form-urlencoded 格式请求。这里需要改成你们实际登录接口的请求参数。 | |
const loginRequest = { | |
url: baseUrl + "/api/v1/login", | |
method: "POST", | |
// body 为 x-www-form-urlencoded 格式 | |
body: { | |
mode: "urlencoded", // 此处为 urlencoded | |
// 此处为 urlencoded | |
urlencoded: [ | |
{ key: "account", value: "apifox" }, | |
{ key: "password", value: "123456" }, | |
], | |
}, | |
/* | |
// body 为 form-data 格式 | |
body: { | |
mode: 'formdata', // 此处为 formdata | |
// 此处为 formdata | |
formdata: [ | |
{ key: 'account', value: 'apifox' }, | |
{ key: 'password', value: '123456' } | |
] | |
} | |
// body 为 json 格式 | |
header: { | |
"Content-Type": "application/json", // 注意:header 需要加上 Content-Type | |
}, | |
body: { | |
mode: 'raw',// 此处为 raw | |
raw: JSON.stringify({ account: 'apifox', password:'123456' }), // 序列化后的 json 字符串 | |
} | |
// body 为 raw 或 json 格式 | |
body: { | |
mode: 'raw', | |
raw: '此处为 body 内容', | |
} | |
*/ | |
}; | |
// 发送请求。 | |
// pm.sendrequest 参考文档: https://apifox.com/help/app/scripts/api-references/pm-reference/#pm-sendrequest | |
pm.sendRequest(loginRequest, function(err, res) { | |
if (err) { | |
console.log(err); | |
} else { | |
// 读取接口返回的 json 数据。 | |
// 如果你的 token 信息是存放在 cookie 的,可以使用 res.cookies.get('token') 方式获取。 | |
// cookies 参考文档:https://apifox.com/help/app/scripts/api-references/pm-reference/#pm-cookies | |
const jsonData = res.json(); | |
// 将 accessToken 写入环境变量 ACCESS_TOKEN | |
pm.environment.set("ACCESS_TOKEN", jsonData.data.accessToken); | |
// 将 accessTokenExpires 过期时间写入环境变量 ACCESS_TOKEN_EXPIRES | |
pm.environment.set( | |
"ACCESS_TOKEN_EXPIRES", | |
jsonData.data.accessTokenExpires | |
); | |
} | |
}); | |
} | |
// 获取环境变量里的 ACCESS_TOKEN | |
const accessToken = pm.environment.get("ACCESS_TOKEN"); | |
// 获取环境变量里的 ACCESS_TOKEN_EXPIRES | |
const accessTokenExpires = pm.environment.get("ACCESS_TOKEN_EXPIRES"); | |
// 如 ACCESS_TOKEN 没有值,或 ACCESS_TOKEN_EXPIRES 已过期,则执行发送登录接口请求 | |
if ( | |
!accessToken || | |
(accessTokenExpires && new Date(accessTokenExpires) <= new Date()) | |
) { | |
sendLoginRequest(); | |
} |
提醒:本文发布于633天前,文中所关联的信息可能已发生改变,请知悉!
AD:【腾讯云服务器大降价】2核4G 222元/3年 1核2G 38元/年
正文完