Postman中如何正确设置OAuth2.0认证参数?遇到401错误怎么办?

a'ゞ素平 阅读 23

我在用Postman测试一个需要OAuth2.0认证的API,按照文档设置了Client ID和Client Secret,但一直返回401 Unauthorized。尝试过把Token Type设成Bearer,还在Headers里手动加了Authorization: Bearer {{token}},但还是不行…

请求体是这样配置的:


{
  "grant_type": "client_credentials",
  "scope": "read write"
}

报错信息显示”Invalid token format”,但之前用同样的参数在代码里能成功获取到token。Postman的Authorization选项卡和请求头到底该怎么配合使用?是不是哪里漏掉了配置步骤?

我来解答 赞 3 收藏
二维码
手机扫码查看
2 条解答
公孙欣辰
看起来你遇到的问题可能是OAuth2.0的配置细节没对上,401错误通常是认证失败或者Token无效导致的。咱们一步步来排查。

首先,Postman的Authorization选项卡其实已经帮你封装了很多OAuth2.0的逻辑,不需要手动在Headers里再加Authorization字段,这样反而可能冲突。建议先把Headers里的手动Authorization去掉,只依赖Authorization选项卡的配置。

接下来重点检查Authorization选项卡的设置。选择OAuth 2.0类型后,确保这些关键参数都正确:
- Token Name随便填一个有意义的名字就行
- Grant Type选Client Credentials,因为你用的是client_credentials模式
- Access Token URL要填对,这个是服务端用来颁发Token的地址
- Client ID和Client Secret填对,注意别有空格
- Scope也得和服务端要求的一致,比如"read write"中间是空格还是逗号要看文档

另外,有些服务端对Content-Type有严格要求,默认可能用的是application/json,但很多OAuth2.0服务端需要的是application/x-www-form-urlencoded。这个可以在Body选项卡里调整,如果Authorization选项卡里没有自动处理的话。

还有一个容易忽略的地方是Token的存储和使用。获取到Token后,Postman会自动把Token加到请求头里,格式一般是Bearer 。如果你手动又加了一次,就会导致"Invalid token format"这种问题。

最后提醒一下安全相关的注意事项:千万别把Client Secret直接写死在代码或者公开的配置文件里,Postman的环境变量功能可以帮你隔离敏感信息。同时,获取到的Token也要妥善保管,避免泄露。

如果按上面的步骤检查完还是不行,可以抓个包看看Postman发出去的请求到底长啥样,跟你在代码里成功调用的请求对比一下,通常能发现问题在哪。我之前也被Postman的OAuth2.0配置坑过好几次,慢慢调总能找到问题的。
点赞
2026-02-19 20:00
闲人志玉
这个问题很常见,我也踩过几次坑。先说重点:你遇到的401和"Invalid token format"错误,大概率是因为Postman里OAuth2.0配置方式不对,或者请求头和Authorization选项卡冲突了。

我们一步步来解决,先搞清楚原理是这样:OAuth2.0的client_credentials模式是服务端到服务端的认证,流程是你用Client ID和Secret去token endpoint换一个access token,然后在后续请求里用这个token做身份验证。关键点在于,token本身要正确获取,并且正确传递。

Postman提供了两种方式设置OAuth2.0:

第一种是使用内置的Authorization选项卡里的“Get New Access Token”。这是推荐做法,因为Postman会自动处理token获取、刷新和注入。

你可以在Authorization标签页选择类型为 OAuth 2.0,然后点击 "Get New Access Token" 按钮。弹出窗口填这些字段:

- Token Name: 随便起个名字比如 test-api-token
- Grant Type: 选 Client Credentials
- Access Token URL: 这个必须填对,一般是类似 https://your-api.com/oauth/token 或 /oauth2/token 的地址(看文档确认)
- Client ID: 填你的
- Client Secret: 填你的
- Scope: 填 read write (多个用空格分隔)
- Client Authentication: 下拉框选 "Send as basic auth header"

注意最后这个很重要!很多API要求把client_id和client_secret通过HTTP Basic认证发送,而不是放在form里。如果你之前是把它们写在body里,那可能是错的。标准做法应该是:

POST /oauth/token
Authorization: Basic base64encode(client_id + ":" + client_secret)
Content-Type: application/x-www-form-urlencoded

body:
grant_type=client_credentials&scope=read+write


而Postman里勾选“Send as basic auth header”就是帮你自动做这个Base64编码并加到请求头。

填完点Request Token按钮。如果成功,你会看到token返回,状态变成“Available”,然后关闭窗口,当前请求就会自动带上 Authorization: Bearer xxxxx。

第二种方式是手动获取token再设置环境变量。比如你先用一个普通POST请求发到token endpoint:

Method: POST
URL: https://your-api.com/oauth/token
Headers:
Authorization: Basic {{base64_client_creds}}
Content-Type: application/x-www-form-urlencoded


Body (x-www-form-urlencoded):
grant_type=client_credentials
scope=read write


其中{{base64_client_creds}}是你提前把 client_id:client_secret 做Base64编码的结果,比如可以用console跑 btoa("your_client_id:your_secret") 得到。

请求成功后,响应体通常是JSON:
{
"access_token": "eyJ...",
"token_type": "Bearer",
"expires_in": 3600
}


这时候你可以把access_token存进环境变量,比如在Tests脚本里写:
// 解析响应
const response = pm.response.json();
// 存入环境变量
pm.environment.set("access_token", response.access_token);


然后再在真正调用API的请求里,在Headers中添加:
Authorization: Bearer {{access_token}}


或者直接在Authorization选项卡里选 Bearer Token 类型,Token填 {{access_token}}。

现在回到你原来的错误:“Invalid token format”。这说明token虽然有了,但格式不对或签名无效。可能原因包括:

1. Client ID/Secret传错了位置 —— 应该走Basic Auth头,不是放body里
2. Access Token URL没对,连到了错误的endpoint
3. Scope格式不对,有的API要求用逗号或特定拼接方式
4. 拿到token后没有及时使用,已经过期(client credentials通常有效期较短)

还有一个容易忽略的点:某些API在返回token时,type是"Bearer",但你在请求时仍然要写成"Bearer xxx",不能只写token值。Postman自动处理这点没问题,但手动设置时要注意。

最后提醒一下,不要同时在Authorization选项卡和Headers里都设Authorization字段。否则会冲突,Postman可能会发两个头,导致服务端拒绝。

总结操作步骤:

第一步:检查文档确认token endpoint是否要求使用HTTP Basic认证传client凭证

第二步:用Postman Authorization -> OAuth 2.0 -> Get New Access Token,正确填写参数,尤其是Client Authentication选“Send as basic auth header”

第三步:点击请求token,等它变成可用状态

第四步:确保主请求的Authorization类型是“Inherit auth from parent”或明确设为使用该token

第五步:发请求,观察结果

如果还是不行,打开Postman的Console(View -> Show Postman Console),重新发一次,看实际发出的请求头和body到底是什么,对比你代码里能工作的那次请求,找出差异。

我以前也卡在这种问题上一整天,后来发现只是Access Token URL少了个s(http写成https),所以细节一定要核对清楚。
点赞 2
2026-02-12 16:46