You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot OAuth2 authorization_code模式获取token返回unauthorized问题

解决Spring Boot OAuth2 Authorization Code模式获取Token返回401的问题

刚接触Spring OAuth2遇到这种问题太正常了,我帮你梳理下最可能的原因和解决步骤:

1. 最常见的坑:/oauth/token必须用POST请求,而非GET

Spring Security OAuth2的Token端点默认只接受POST请求,这是出于安全考虑——GET请求的参数会暴露在URL里,而授权码、客户端密钥这类敏感信息不应该这么传递。你用GET调用的话,直接就会返回401 Unauthorized,这大概率是你当前的核心问题。

2. 确保传递正确的请求参数和客户端认证

改成POST请求后,还需要确保以下几个关键点:

  • 必须携带grant_type=authorization_code参数,明确授权类型
  • 要传递code参数:就是你之前从/oauth/authorize拿到的授权码
  • 必须传递redirect_uri:这个值要和你申请授权码时(调用/oauth/authorize)用的redirect_uri完全一致,哪怕多一个斜杠、大小写不同都会导致验证失败
  • 客户端身份认证:Spring默认要求调用Token端点的客户端必须认证,有两种方式:
    • 方式一(推荐):在请求头里添加Basic Auth,格式为Authorization: Basic <Base64编码的client_id:client_secret>
    • 方式二:在POST参数里直接传递client_id和client_secret(这种方式安全性较低,不建议生产环境使用)

3. 检查授权码的有效性

授权码有两个限制:

  • 一次性使用:用过一次之后就会被标记为无效,不能重复使用
  • 有效期限制:默认授权码的有效期是10分钟,超过时间也会导致验证失败

你可以去PostgreSQL里查看存储授权码的表(默认是oauth_code),确认你的授权码还没被使用,且expires_at字段还没过期。

4. 关于principle的疑问

你提到没传递principle,这点完全没问题——Authorization Code模式下,Spring会通过授权码关联到你之前授权时的用户会话,自动处理用户身份,不需要手动传递principle参数,这不是导致401的原因。

示例请求(用curl)

给你一个正确的POST请求示例,替换成你的实际参数即可:

curl -X POST "http://localhost:8080/oauth/token" \
  -H "Authorization: Basic Y2xpZW50X2lkOmNsaWVudF9zZWNyZXQ=" \
  -d "grant_type=authorization_code" \
  -d "code=你的授权码值" \
  -d "redirect_uri=http://你的回调地址"

排查步骤总结

  1. 立刻把请求方法从GET改成POST
  2. 核对所有参数是否齐全且正确,尤其是redirect_uri和客户端认证信息
  3. 确认授权码未被使用且在有效期内

内容的提问来源于stack exchange,提问作者Mattie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:05:49