使用/authorize、/oauth/token获取access_token访问自定义API报403如何解决
问题根因与解决方案
你遇到的403问题基本是以下几个配置遗漏导致的,按优先级排查即可:
1. 申请Access Token时未携带audience参数(最高概率)
你在跳转到Auth0 /authorize 端点请求授权时,必须额外携带 audience 参数,参数值为你在Auth0后台创建自定义API时填写的API Identifier。如果缺失该参数,Auth0返回的Access Token是仅适用于Auth0自有/userinfo接口的 opaque token 或者受众不符的JWT,无法通过你自定义后端的校验,直接返回403。
2. 自定义AuthTokenFilter未完成合法认证信息注入
你配置的自定义AuthTokenFilter只实现了授权码换Token的逻辑,大概率缺失请求携带Access Token的校验流程,需要补充以下逻辑:
- 从请求头提取
Authorization字段,校验格式为Bearer {token},取出Token值 - 验证Token的签名有效性、签发者(iss固定为
https://<你的Auth0域名>/)、受众(aud为前述audience值)、过期时间等核心字段 - 验证通过后,构造合法的认证对象(如
UsernamePasswordAuthenticationToken)注入到SecurityContextHolder中,Spring Security才会识别为已认证用户
如果不想自行维护Filter逻辑,推荐直接使用Spring官方OAuth2资源服务器依赖,避免自定义逻辑出错:
- 引入依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-resource-server</artifactId> </dependency>
- 新增配置:
spring: security: oauth2: resourceserver: jwt: issuer-uri: https://<你的Auth0域名>/ audiences: <你的自定义API Identifier>
- 在SecurityConfig的
configure方法中添加JWT校验配置即可,无需自定义Filter:
http.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt);
3. 授权规则匹配逻辑错误
你当前的authorizeRequests配置拆分了两次,且未兜底所有请求的规则,Spring Security对未匹配到规则的请求默认拒绝访问,会触发403。调整为统一的规则配置:
http.authorizeRequests() // 所有公开路径统一放最前面 .antMatchers("/app/cfg/ext/**", LOGIN_URL).permitAll() // 自定义需认证路径 .antMatchers("/user").authenticated() // 兜底规则:其余所有请求均需认证 .anyRequest().authenticated();
4. 校验Token传输格式
确认请求头的格式为Authorization: Bearer <Access Token>,注意Bearer与Token之间必须有空格,且Bearer首字母大写。
内容的提问来源于stack exchange,提问作者wojg21
相关产品推荐
相关产品推荐

