@@ -25,7 +25,10 @@ use oauth2_types::{
25
25
} ;
26
26
use sqlx:: PgPool ;
27
27
28
- use crate :: test_utils:: { init_tracing, RequestBuilderExt , ResponseExt , TestState } ;
28
+ use crate :: {
29
+ test_utils,
30
+ test_utils:: { init_tracing, RequestBuilderExt , ResponseExt , TestState } ,
31
+ } ;
29
32
30
33
async fn create_test_client ( state : & TestState ) -> Client {
31
34
let mut repo = state. repository ( ) . await . unwrap ( ) ;
@@ -378,7 +381,7 @@ async fn test_oauth2_client_credentials(pool: PgPool) {
378
381
let client_id = response. client_id ;
379
382
let client_secret = response. client_secret . expect ( "to have a client secret" ) ;
380
383
381
- // Call the token endpoint with an empty scope
384
+ // Call the token endpoint with the graphql scope
382
385
let request = Request :: post ( mas_router:: OAuth2TokenEndpoint :: PATH ) . form ( serde_json:: json!( {
383
386
"grant_type" : "client_credentials" ,
384
387
"client_id" : client_id,
@@ -424,6 +427,28 @@ async fn test_oauth2_client_credentials(pool: PgPool) {
424
427
} )
425
428
) ;
426
429
430
+ // We shouldn't be able to call the addUser mutation
431
+ let request = Request :: post ( "/graphql" )
432
+ . bearer ( & access_token)
433
+ . json ( serde_json:: json!( {
434
+ "query" : r#"
435
+ mutation {
436
+ addUser(input: {username: "alice"}) {
437
+ user {
438
+ id
439
+ username
440
+ }
441
+ }
442
+ }
443
+ "# ,
444
+ } ) ) ;
445
+ let response = state. request ( request) . await ;
446
+ response. assert_status ( StatusCode :: OK ) ;
447
+ let response: GraphQLResponse = response. json ( ) ;
448
+ // There should be an error
449
+ assert_eq ! ( response. errors. len( ) , 1 ) ;
450
+ assert ! ( response. data. is_null( ) ) ;
451
+
427
452
// Check that we can't do a query once the token is revoked
428
453
let request = Request :: post ( mas_router:: OAuth2Revocation :: PATH ) . form ( serde_json:: json!( {
429
454
"token" : access_token,
@@ -453,4 +478,56 @@ async fn test_oauth2_client_credentials(pool: PgPool) {
453
478
454
479
let response = state. request ( request) . await ;
455
480
response. assert_status ( StatusCode :: UNAUTHORIZED ) ;
481
+
482
+ // Now make the client admin and try again
483
+ let state = {
484
+ let mut state = state;
485
+ state. policy_factory = test_utils:: policy_factory ( serde_json:: json!( {
486
+ "admin_clients" : [ client_id] ,
487
+ } ) )
488
+ . await
489
+ . unwrap ( ) ;
490
+ state
491
+ } ;
492
+
493
+ // Ask for a token again, with the admin scope
494
+ let request = Request :: post ( mas_router:: OAuth2TokenEndpoint :: PATH ) . form ( serde_json:: json!( {
495
+ "grant_type" : "client_credentials" ,
496
+ "client_id" : client_id,
497
+ "client_secret" : client_secret,
498
+ "scope" : "urn:mas:graphql:* urn:mas:admin" ,
499
+ } ) ) ;
500
+
501
+ let response = state. request ( request) . await ;
502
+ response. assert_status ( StatusCode :: OK ) ;
503
+ let AccessTokenResponse { access_token, .. } = response. json ( ) ;
504
+
505
+ // We should now be able to call the addUser mutation
506
+ let request = Request :: post ( "/graphql" )
507
+ . bearer ( & access_token)
508
+ . json ( serde_json:: json!( {
509
+ "query" : r#"
510
+ mutation {
511
+ addUser(input: {username: "alice"}) {
512
+ user {
513
+ username
514
+ }
515
+ }
516
+ }
517
+ "# ,
518
+ } ) ) ;
519
+ let response = state. request ( request) . await ;
520
+ response. assert_status ( StatusCode :: OK ) ;
521
+ let response: GraphQLResponse = response. json ( ) ;
522
+ assert ! ( response. errors. is_empty( ) ) ;
523
+ assert_eq ! (
524
+ response. data,
525
+ serde_json:: json!( {
526
+ "addUser" : {
527
+ "user" : {
528
+ "username" : "alice"
529
+ }
530
+ }
531
+ } )
532
+ ) ;
456
533
}
0 commit comments