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命令快速验证配置是否生效:
- 获取device code和user code:
curl -X POST http://localhost:8080/oauth2/device_authorization \ -d "client_id=device-client&scope=read write"
- 用户在验证页面输入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
相关产品推荐
相关产品推荐

