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

Spring OAuth2 Server校验JWT令牌返回401未授权问题排查

为什么Spring Boot OAuth2 Server的/oauth/check_token端点返回401?

我帮你分析下几个最可能的原因,结合你的代码来看:

1. check_token端点要求客户端认证,你没提供对应的凭证

看你代码里的AuthorizationServerSecurityConfigurer配置:

oauthServer.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()").allowFormAuthenticationForClients();

这里的checkTokenAccess("isAuthenticated()")明确要求:访问/oauth/check_token的请求必须先完成客户端身份认证,也就是调用这个端点的一方(通常是资源服务器)需要以OAuth2客户端的身份证明自己的合法性,而不是把要校验的JWT放在Authorization头里就完事。

你现在只把待校验的JWT放在Authorization头,但这个端点不认这个——它需要的是客户端的认证信息,比如:

  • 用Basic Auth:把客户端的client_id和client_secret用Base64编码后,放在Authorization: Basic xxx头里
  • 用表单参数:因为你开了allowFormAuthenticationForClients(),也可以在POST表单里直接传client_id和client_secret参数

2. 待校验的JWT传递方式错误

/oauth/check_token端点并不通过Authorization头接收要校验的令牌,而是需要把JWT作为**POST表单参数token**来传递。你之前把JWT放在Authorization头的做法,相当于把令牌当成了客户端认证凭证,这完全不符合接口的要求。

举个正确的请求示例(用curl):

curl -X POST http://auth_server/oauth/check_token \
  -H "Authorization: Basic Y2xpZW50X2lkOmNsaWVudF9zZWNyZXQ=" \
  -d "token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"

这里Basic后面的字符串是client_id:client_secret的Base64编码,token参数才是你要校验的JWT。

3. 客户端配置存在问题

如果上述两点都做了还是返回401,那要检查你的ClientDetailsServiceImpl里的客户端配置:

  • 确认client_id和client_secret是否正确,特别是密码是否和你请求时用的一致(你的代码用了PasswordEncoderFactories.createDelegatingPasswordEncoder(),要确保存储的密码是加密后的格式)
  • 确认客户端是否被允许访问这个端点(默认只要客户端存在且认证通过就可以,除非你额外加了权限限制)

总结解决步骤

  1. 给/oauth/check_token的请求加上客户端认证信息(Basic Auth或表单参数)
  2. 将待校验的JWT放在POST表单的token参数中传递
  3. 验证客户端的client_id、client_secret配置是否正确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 23:42:35