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

Spring Security OAuth2授权服务器如何为采用ClientAuthenticationMethod.NONE的公开客户端支持设备授权流

Spring Security OAuth2授权服务器如何为采用ClientAuthenticationMethod.NONE的公开客户端支持设备授权流

我之前帮不少开发者处理过类似的场景,用Spring Security OAuth2 Authorization Server 1.4.3给**公开客户端(采用ClientAuthenticationMethod.NONE)**配置设备授权流其实不算复杂,但有几个关键配置点得注意,我给你一步步拆解:

1. 正确配置RegisteredClient

首先,注册客户端的时候,除了指定ClientAuthenticationMethod.NONE,还要明确开启设备授权的授权类型,同时调整客户端设置适配公开客户端的特性:

RegisteredClient deviceClient = RegisteredClient.withId(UUID.randomUUID().toString())
        .clientId("device-client")
        // 指定无客户端认证方式
        .clientAuthenticationMethod(ClientAuthenticationMethod.NONE)
        // 启用设备授权流
        .authorizationGrantType(AuthorizationGrantType.DEVICE_CODE)
        // 可选:如果需要刷新令牌,加上这个授权类型
        .authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN)
        // 配置客户端需要的权限范围
        .scope("read")
        .scope("write")
        // 公开客户端不需要PKCE,这里设为false
        .clientSettings(ClientSettings.builder()
                .requireProofKey(false)
                .build())
        // 按需配置令牌有效期
        .tokenSettings(TokenSettings.builder()
                .accessTokenTimeToLive(Duration.ofMinutes(15))
                .refreshTokenTimeToLive(Duration.ofDays(7))
                .build())
        .build();

2. 配置授权服务器的安全过滤器链

要确保设备授权相关的端点对公开客户端开放,不需要前置认证,同时可以按需自定义验证页面和同意页面:

@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
    // 应用授权服务器的默认安全配置
    OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);

    // 配置设备授权端点和验证端点
    http.getConfigurer(OAuth2AuthorizationServerConfigurer.class)
            .deviceAuthorizationEndpoint(device -> device
                    // 自定义用户验证页面的地址,用户会被引导到这里输入user code
                    .verificationUri("http://localhost:8080/activate")
            )
            .deviceVerificationEndpoint(device -> device
                    // 自定义用户授权同意页面,用户登录后在这里确认授权
                    .consentPage("/oauth2/device-consent")
            );

    // 允许公开客户端访问设备授权的核心端点
    http.authorizeHttpRequests(authorize -> authorize
            // 设备授权请求端点和令牌交换端点,公开客户端无需认证即可访问
            .requestMatchers("/oauth2/device_authorization", "/oauth2/token")
            .permitAll()
            // 其他请求需要用户认证
            .anyRequest().authenticated()
    );

    return http.build();
}

3. 关键注意事项

  • 令牌端点(/oauth2/token)默认已经支持无客户端认证的设备授权流请求,只要你没有自定义覆盖客户端认证逻辑,就不用额外修改。
  • 如果你自己实现了ClientAuthenticationManager,要确保它能正确处理ClientAuthenticationMethod.NONE的情况,不过默认的管理器已经支持这个场景。
  • 自定义的验证页面和同意页面需要允许匿名访问(或者引导用户先登录),这样用户才能输入user code并完成授权操作。

测试流程(可选)

你可以用curl命令快速验证配置是否生效:

  1. 获取device code和user code:
curl -X POST http://localhost:8080/oauth2/device_authorization \
  -d "client_id=device-client&scope=read write"
  1. 用户在验证页面输入user code并完成授权后,客户端用device code换取令牌:
curl -X POST http://localhost:8080/oauth2/token \
  -d "client_id=device-client&grant_type=urn:ietf:params:oauth:grant-type:device_code&device_code=你的device_code"

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 12:34:50