Spring Authorization Server返回invalid_grant错误排查求助
问题分析与解决方案
常见原因及对应解决方法
1. 授权码已被使用或过期
Authorization Code模式下,授权码是一次性有效的,一旦被兑换成令牌就会失效。如果你的客户端(如http://127.0.0.1:8222对应的服务)已经自动用该授权码换过令牌,或者授权码超过默认有效期(通常5分钟),再次使用就会返回invalid_grant。
解决方法:
- 重新走授权流程获取新的授权码,拿到后立即在Postman中使用,避免过期。
- 测试前关闭客户端服务,防止其自动处理授权码兑换逻辑。
2. 客户端认证方式错误
你的客户端配置的认证方式是client_secret_basic,调用令牌端点时必须遵循Basic Auth规范传递凭证:
- 将
client_id:client_secret做Base64编码,放在请求头Authorization中,格式为Basic <Base64编码字符串>。 - 示例:你的
client_id=oidc-client、client_secret=secret,编码后为b2lkYy1jbGllbnQ6c2VjcmV0,请求头应为Authorization: Basic b2lkYy1jbGllbnQ6c2VjcmV0。
Postman设置步骤:
- 新建POST请求,地址填
http://localhost:9000/oauth2/token。 - 切换到
Authorization标签,类型选择Basic Auth。 - 输入Username为
oidc-client,Password为secret,Postman会自动生成合规的Authorization头。
3. 重定向URI不匹配
兑换令牌时,必须传递和获取授权码时完全一致的redirect_uri参数,包括协议、IP/域名、端口、路径,大小写也必须一致。
检查点:
- 确认Postman请求体中
redirect_uri参数值为http://127.0.0.1:8222/login/oauth2/code/oidc-client,和授权请求中的地址完全相同。 - 请求体需包含以下
x-www-form-urlencoded参数:grant_type=authorization_codecode=<新获取的授权码>redirect_uri=<和授权时一致的地址>
4. 配置冲突问题
你同时在application.yml和SecurityConfig的registeredClientRepository()方法中配置了客户端信息,这可能导致Spring Authorization Server加载的客户端配置不一致,引发认证失败。
解决方法:
- 保留其中一种配置方式即可,推荐删除
application.yml中的spring.security.oauth2.authorizationserver.client部分,因为代码中通过RegisteredClientRepository注册的客户端优先级更高。
5. 会话关联失效
授权码和用户的登录会话绑定,如果获取授权码后,用户会话失效(比如重启授权服务器、浏览器清除Cookie),授权码会直接失效。
解决方法:
- 获取授权码后,在同一个会话有效期内(未重启服务、未清除Cookie)立即兑换令牌。
测试验证步骤
- 重启授权服务器,确保配置修改生效。
- 重新访问授权端点,完成登录和授权同意流程,获取新的授权码。
- 在Postman中按要求构建请求:
- 请求方法:POST
- 请求地址:
http://localhost:9000/oauth2/token - Authorization:Basic Auth,用户名
oidc-client,密码secret - 请求体:选择
x-www-form-urlencoded,添加参数:grant_type:authorization_codecode:<新获取的授权码>redirect_uri:http://127.0.0.1:8222/login/oauth2/code/oidc-client
- 发送请求,正常情况下会返回包含
access_token的响应。
内容的提问来源于stack exchange,提问作者Ali Raza
相关产品推荐
相关产品推荐

