如何在Postman请求内完成第三方服务授权流程?
问题背景
我想在Postman里实现应用的第三方服务授权流程,不用每次把链接复制到浏览器里操作。这个授权流程是这样的:
- 客户端点按钮触发请求
- 应用检查有没有token,没有就返回第三方的授权链接
- 客户端跳转到授权链接,输入账号密码提交表单
- 第三方服务带着authorization code作为查询参数,重定向回应用
- 客户端再点另一个按钮,用这个code换token
我之前在Test标签写了段脚本,但完全没效果,代码是这样的:
var jsonData = JSON.parse(responseBody); console.log(jsonData.data) if (jsonData.data) { pm.sendRequest(jsonData.data, function (err, response) { console.log(response); return response; }); }
为啥之前的脚本没用?
你这段脚本只是用pm.sendRequest请求了授权链接,但第三方的授权页面是HTML表单页,不是普通API接口。pm.sendRequest只能拿到页面的HTML代码,没法模拟你输入账号密码、点提交的操作,也处理不了页面跳转逻辑,所以跑了等于白跑。
在Postman里完成授权的具体步骤
其实可以在Postman里搞定,分几步来,结合环境变量和脚本就行:
存授权链接
先发第一步的请求(就是客户端点按钮触发的那个),在Test脚本里把返回的授权链接存到环境变量里:var jsonData = pm.response.json(); if (jsonData.data) { pm.environment.set("auth_url", jsonData.data); console.log("授权链接已经存到环境变量里了:", jsonData.data); }在Postman内置浏览器里填授权表单
从环境变量里把auth_url复制出来,在Postman开个新标签页,把链接粘到地址栏回车。这时候会加载第三方的授权页面,你直接在Postman的内置浏览器里输入凭证、提交表单就行,不用切到外部浏览器。抓authorization code
提交表单后,第三方会重定向回应用的回调地址,这时候Postman地址栏的URL里会有个code参数,就是我们要的authorization code。把这个code存到环境变量里——嫌手动输麻烦的话,也可以在回调请求的Test脚本里自动提取:var code = pm.request.url.query.get("code"); if (code) { pm.environment.set("auth_code", code); console.log("授权码已经提取并存储:", code); }用code换token
新建一个请求,把请求里需要填code的地方换成{{auth_code}}(引用环境变量),发请求就能拿到token了。
进阶小技巧:减少手动操作
要是想再懒一点,可以试试Postman的拦截器:
- 开启拦截器,确保授权过程中的Cookie能正常传递,避免登录态丢失。
- 在请求授权链接的Pre-request Script里加一句
pm.request.followRedirects = true;,让Postman自动跟随重定向。
不过要注意,第三方的人机验证、验证码这些还是得手动弄,Postman没法完全模拟人的操作。
内容的提问来源于stack exchange,提问作者ArMANIAK

