33
33
import org .springframework .beans .factory .annotation .Autowired ;
34
34
import org .springframework .context .annotation .Bean ;
35
35
import org .springframework .context .annotation .Import ;
36
+ import org .springframework .core .Ordered ;
37
+ import org .springframework .core .annotation .Order ;
36
38
import org .springframework .http .HttpHeaders ;
37
39
import org .springframework .http .HttpStatus ;
38
40
import org .springframework .http .MediaType ;
45
47
import org .springframework .mock .http .client .MockClientHttpResponse ;
46
48
import org .springframework .mock .web .MockHttpServletResponse ;
47
49
import org .springframework .security .authentication .UsernamePasswordAuthenticationToken ;
50
+ import org .springframework .security .config .Customizer ;
51
+ import org .springframework .security .config .annotation .web .builders .HttpSecurity ;
48
52
import org .springframework .security .config .annotation .web .configuration .EnableWebSecurity ;
49
53
import org .springframework .security .crypto .password .NoOpPasswordEncoder ;
50
54
import org .springframework .security .crypto .password .PasswordEncoder ;
72
76
import org .springframework .security .oauth2 .server .authorization .config .annotation .web .configuration .OAuth2AuthorizationServerConfiguration ;
73
77
import org .springframework .security .oauth2 .server .authorization .test .SpringTestContext ;
74
78
import org .springframework .security .oauth2 .server .authorization .test .SpringTestContextExtension ;
79
+ import org .springframework .security .web .SecurityFilterChain ;
75
80
import org .springframework .test .web .servlet .MockMvc ;
76
81
import org .springframework .test .web .servlet .MvcResult ;
77
82
import org .springframework .util .LinkedMultiValueMap ;
90
95
* Integration tests for OAuth 2.0 Device Grant.
91
96
*
92
97
* @author Steve Riesenberg
98
+ * @author Greg Li
93
99
*/
94
100
@ ExtendWith (SpringTestContextExtension .class )
95
101
public class OAuth2DeviceCodeGrantTests {
@@ -158,7 +164,7 @@ public static void destroy() {
158
164
159
165
@ Test
160
166
public void requestWhenDeviceAuthorizationRequestNotAuthenticatedThenUnauthorized () throws Exception {
161
- this .spring .register (AuthorizationServerConfiguration .class ).autowire ();
167
+ this .spring .register (AuthorizationServerConfigurationDeviceAuthorize .class ).autowire ();
162
168
163
169
// @formatter:off
164
170
RegisteredClient registeredClient = TestRegisteredClients .registeredClient ()
@@ -179,9 +185,32 @@ public void requestWhenDeviceAuthorizationRequestNotAuthenticatedThenUnauthorize
179
185
// @formatter:on
180
186
}
181
187
188
+ @ Test
189
+ public void requestWhenDeviceAuthorizationRequestDisabledThenUnauthorized () throws Exception {
190
+ this .spring .register (AuthorizationServerConfigurationDeviceAuthorize .class ).autowire ();
191
+
192
+ // @formatter:off
193
+ RegisteredClient registeredClient = TestRegisteredClients .registeredClient ()
194
+ .authorizationGrantType (AuthorizationGrantType .DEVICE_CODE )
195
+ .build ();
196
+ // @formatter:on
197
+ this .registeredClientRepository .save (registeredClient );
198
+
199
+ MultiValueMap <String , String > parameters = new LinkedMultiValueMap <>();
200
+ parameters .set (OAuth2ParameterNames .CLIENT_ID , registeredClient .getClientId ());
201
+ parameters .set (OAuth2ParameterNames .SCOPE ,
202
+ StringUtils .collectionToDelimitedString (registeredClient .getScopes (), " " ));
203
+
204
+ // @formatter:off
205
+ this .mvc .perform (post (DEFAULT_DEVICE_AUTHORIZATION_ENDPOINT_URI )
206
+ .params (parameters ))
207
+ .andExpect (status ().isUnauthorized ());
208
+ // @formatter:on
209
+ }
210
+
182
211
@ Test
183
212
public void requestWhenRegisteredClientMissingThenUnauthorized () throws Exception {
184
- this .spring .register (AuthorizationServerConfiguration .class ).autowire ();
213
+ this .spring .register (AuthorizationServerConfigurationDeviceAuthorize .class ).autowire ();
185
214
186
215
// @formatter:off
187
216
RegisteredClient registeredClient = TestRegisteredClients .registeredClient ()
@@ -204,7 +233,7 @@ public void requestWhenRegisteredClientMissingThenUnauthorized() throws Exceptio
204
233
205
234
@ Test
206
235
public void requestWhenDeviceAuthorizationRequestValidThenReturnDeviceAuthorizationResponse () throws Exception {
207
- this .spring .register (AuthorizationServerConfiguration .class ).autowire ();
236
+ this .spring .register (AuthorizationServerConfigurationDeviceAuthorize .class ).autowire ();
208
237
209
238
// @formatter:off
210
239
RegisteredClient registeredClient = TestRegisteredClients .registeredClient ()
@@ -252,7 +281,7 @@ public void requestWhenDeviceAuthorizationRequestValidThenReturnDeviceAuthorizat
252
281
253
282
@ Test
254
283
public void requestWhenDeviceVerificationRequestUnauthenticatedThenUnauthorized () throws Exception {
255
- this .spring .register (AuthorizationServerConfiguration .class ).autowire ();
284
+ this .spring .register (AuthorizationServerConfigurationDeviceAuthorize .class ).autowire ();
256
285
257
286
// @formatter:off
258
287
RegisteredClient registeredClient = TestRegisteredClients .registeredClient ()
@@ -286,7 +315,7 @@ public void requestWhenDeviceVerificationRequestUnauthenticatedThenUnauthorized(
286
315
287
316
@ Test
288
317
public void requestWhenDeviceVerificationRequestValidThenDisplaysConsentPage () throws Exception {
289
- this .spring .register (AuthorizationServerConfiguration .class ).autowire ();
318
+ this .spring .register (AuthorizationServerConfigurationDeviceAuthorize .class ).autowire ();
290
319
291
320
// @formatter:off
292
321
RegisteredClient registeredClient = TestRegisteredClients .registeredClient ()
@@ -335,7 +364,7 @@ public void requestWhenDeviceVerificationRequestValidThenDisplaysConsentPage() t
335
364
336
365
@ Test
337
366
public void requestWhenDeviceAuthorizationConsentRequestUnauthenticatedThenBadRequest () throws Exception {
338
- this .spring .register (AuthorizationServerConfiguration .class ).autowire ();
367
+ this .spring .register (AuthorizationServerConfigurationDeviceAuthorize .class ).autowire ();
339
368
340
369
// @formatter:off
341
370
RegisteredClient registeredClient = TestRegisteredClients .registeredClient ()
@@ -373,7 +402,7 @@ public void requestWhenDeviceAuthorizationConsentRequestUnauthenticatedThenBadRe
373
402
374
403
@ Test
375
404
public void requestWhenDeviceAuthorizationConsentRequestValidThenRedirectsToSuccessPage () throws Exception {
376
- this .spring .register (AuthorizationServerConfiguration .class ).autowire ();
405
+ this .spring .register (AuthorizationServerConfigurationDeviceAuthorize .class ).autowire ();
377
406
378
407
// @formatter:off
379
408
RegisteredClient registeredClient = TestRegisteredClients .registeredClient ()
@@ -423,7 +452,7 @@ public void requestWhenDeviceAuthorizationConsentRequestValidThenRedirectsToSucc
423
452
424
453
@ Test
425
454
public void requestWhenAccessTokenRequestUnauthenticatedThenUnauthorized () throws Exception {
426
- this .spring .register (AuthorizationServerConfiguration .class ).autowire ();
455
+ this .spring .register (AuthorizationServerConfigurationDeviceAuthorize .class ).autowire ();
427
456
428
457
// @formatter:off
429
458
RegisteredClient registeredClient = TestRegisteredClients .registeredClient ()
@@ -459,7 +488,7 @@ public void requestWhenAccessTokenRequestUnauthenticatedThenUnauthorized() throw
459
488
460
489
@ Test
461
490
public void requestWhenAccessTokenRequestValidThenReturnAccessTokenResponse () throws Exception {
462
- this .spring .register (AuthorizationServerConfiguration .class ).autowire ();
491
+ this .spring .register (AuthorizationServerConfigurationDeviceAuthorize .class ).autowire ();
463
492
464
493
// @formatter:off
465
494
RegisteredClient registeredClient = TestRegisteredClients .registeredClient ()
@@ -545,7 +574,17 @@ private static Function<OAuth2Authorization.Token<? extends OAuth2Token>, Boolea
545
574
546
575
@ EnableWebSecurity
547
576
@ Import (OAuth2AuthorizationServerConfiguration .class )
548
- static class AuthorizationServerConfiguration {
577
+ static class AuthorizationServerConfigurationDeviceAuthorize {
578
+
579
+ @ Bean
580
+ @ Order (Ordered .HIGHEST_PRECEDENCE )
581
+ public SecurityFilterChain authorizationServerSecurityFilterChain (HttpSecurity http ) throws Exception {
582
+ OAuth2AuthorizationServerConfiguration .applyDefaultSecurity (http );
583
+ http .getConfigurer (OAuth2AuthorizationServerConfigurer .class )
584
+ .deviceAuthorizationEndpoint (Customizer .withDefaults ()) // Enable deviceAuthorizationEndpoint
585
+ .deviceVerificationEndpoint (Customizer .withDefaults ()); // Enable deviceVerificationEndpoint
586
+ return http .build ();
587
+ }
549
588
550
589
@ Bean
551
590
RegisteredClientRepository registeredClientRepository (JdbcOperations jdbcOperations ) {
0 commit comments