oauth2中token端点跨域配置

在vue前端访问springboot2.7+security+oauth2搭建的认证授权服务器的oauth/token端点时,发生跨域问题。
场景:访问oauth/token接口时,在认证授权服务中已添加了springboot2.7版本的跨域配置,且在WebSecurityConfig和ResourceServerConfig中均已开启去允许跨域,还是发生了跨域。
分析:分析过后怀疑是/oauth/*端点被加入到spring security过滤链中了,这时需要自己写过滤器,并设置优先级高于security过滤器。
解决:
针对/oauth/*端点的跨域配置

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter implements Filter {

    public CorsFilter() {
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");

        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
    }

    @Override
    public void init(FilterConfig filterConfig) {
    }

    @Override
    public void destroy() {
    }
}

跨域请求时会先发送OPTIONS请求,而OPTIONS请求头并不会携带认证信息,需要放开。Spring源码中地址/oauth/token默认的访问控制策略是”fullyAuthenticated“,导致跨域时OPTIONS请求因认证失败而跳转/ERROR返回错误响应。

其实,还可以采用在webSecurity中ignore请求类型为options的请求,并在AuthorizationServerConfig中的endpoints设置跨域的配置。
后续若有更新,会持续更新。

### OAuth2 端点的实现与配置 #### 授权端点 (Authorization Endpoint) 授权端点主要用于处理用户的认证请求并重定向到第三方服务提供商进行身份验证。通过 `oauth2Login().authorizationEndpoint()` 方法可以自定义该端点的行为[^2]。例如,可以通过设置回调 URI 或者调整 HTTP 请求参数来满足特定需求。 以下是配置授权端点的一个简单示例: ```java http.oauth2Login() .authorizationEndpoint() .baseUri("/auth/authorize") // 设置基础URI路径 .authorizedRedirectUri("https://example.com/callback"); // 配置合法的回调地址 ``` #### 令牌端点 (Token Endpoint) 令牌端点负责接收来自授权服务器的访问令牌,并将其存储以便后续 API 调用使用。`oauth2Login().tokenEndpoint()` 提供了对该过程的控制能力。如果需要修改默认行为(比如支持不同的响应类型),可以在这一阶段进行定制化开发。 下面是一个关于如何配置令牌端点的例子: ```java http.oauth2Login() .tokenEndpoint() .accessTokenResponseClient(customAccessTokenResponseClient()); // 使用自定义客户端获取 token ``` 其中 `customAccessTokenResponseClient` 是开发者自行编写的类实例,用于替代 Spring Security 默认实现的部分逻辑。 #### 处理特殊场景下的兼容性问题 当遇到某些特殊的第三方登录平台返回的数据格式不符合标准时,则可能需要用到更深层次的扩展机制[^3]。这通常涉及重新定义解析器或者适配器模式的应用程序组件设计思路。 假设某外部服务商提供了非标准化 JSON 结构作为其 ID Token 的组成部分之一,在这种情况下就需要创建一个新的 Converter 来完成数据映射工作流程如下所示: ```java @Bean public JwtDecoder jwtDecoder() { NimbusJwtDecoder decoder = (NimbusJwtDecoder) JwtDecoders.fromOidcIssuerLocation(issuerUri); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(new CustomClaimsModule()); decoder.setJwtValidator(...); // 添加额外校验规则 return decoder; } ``` 这里引入了一个名为 `CustomClaimsModule` 的 Jackson Module 对象,它能够帮助我们将不寻常字段转换成内部模型属性值。 #### 解决资源共享(CORS) 和预检请求(Preflight Request) 为了使前端应用顺利调用后端接口资源而不受浏览器同源策略限制影响,有必要考虑 CORS 政策以及 OPTIONS 方法的支持情况[^4]。一种常见做法是在全局过滤链里忽略掉所有针对 options 动词发起的操作;与此同时也要记得在 OpenID Connect Provider Metadata 中声明允许哪些来源名访问敏感材料。 代码片段展示如下: ```java @Override protected void configure(HttpSecurity http) throws Exception { http.cors(cors -> cors.configurationSource(request -> { CorsConfiguration config = new CorsConfiguration(); config.addAllowedOrigin("*"); config.setMaxAge(3600L); return config; })) .csrf(csrf -> csrf.disable()) .authorizeHttpRequests(authz -> authz.anyRequest().authenticated()); WebMvcConfigurer adapter = registry -> { registry.addCorsMapping("/**").allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS"); }; } // 另外一处重要位置 @Configuration @EnableWebSecurity @Order(SecurityProperties.BASIC_AUTH_ORDER - 1) public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { endpoints.allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST, HttpMethod.OPTIONS); } } ``` 以上就是有关于 OAuth2 登录过程中涉及到的主要几个方面——即授权、取号及其周边配套设施建设方面的介绍说明文档内容总结完毕! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值