@@ -292,7 +292,8 @@ static apr_byte_t oidc_proto_parse_idtoken_and_validate_code(request_rec *r, oid
292292 */
293293static apr_byte_t oidc_proto_resolve_code (request_rec * r , oidc_cfg_t * cfg , oidc_provider_t * provider , const char * code ,
294294 const char * code_verifier , char * * id_token , char * * access_token ,
295- char * * token_type , int * expires_in , char * * refresh_token , const char * state ) {
295+ char * * token_type , int * expires_in , char * * refresh_token , char * * scope ,
296+ const char * state ) {
296297
297298 oidc_debug (r , "enter" );
298299
@@ -310,7 +311,7 @@ static apr_byte_t oidc_proto_resolve_code(request_rec *r, oidc_cfg_t *cfg, oidc_
310311 apr_table_setn (params , OIDC_PROTO_STATE , state );
311312
312313 return oidc_proto_token_endpoint_request (r , cfg , provider , params , id_token , access_token , token_type ,
313- expires_in , refresh_token );
314+ expires_in , refresh_token , scope );
314315}
315316
316317/*
@@ -326,6 +327,7 @@ static apr_byte_t oidc_proto_resolve_code_and_validate_response(request_rec *r,
326327 int expires_in = -1 ;
327328 char * refresh_token = NULL ;
328329 char * code_verifier = NULL ;
330+ char * scope = NULL ;
329331
330332 if (oidc_proto_profile_pkce_get (provider ) != & oidc_pkce_none )
331333 oidc_proto_profile_pkce_get (provider )-> verifier (r , oidc_proto_state_get_pkce_state (proto_state ),
@@ -334,7 +336,7 @@ static apr_byte_t oidc_proto_resolve_code_and_validate_response(request_rec *r,
334336 const char * state = oidc_proto_state_get_state (proto_state );
335337
336338 if (oidc_proto_resolve_code (r , c , provider , apr_table_get (params , OIDC_PROTO_CODE ), code_verifier , & id_token ,
337- & access_token , & token_type , & expires_in , & refresh_token , state ) == FALSE) {
339+ & access_token , & token_type , & expires_in , & refresh_token , & scope , state ) == FALSE) {
338340 oidc_error (r , "failed to resolve the code" );
339341 OIDC_METRICS_COUNTER_INC (r , c , OM_PROVIDER_TOKEN_ERROR );
340342 return FALSE;
@@ -364,6 +366,10 @@ static apr_byte_t oidc_proto_resolve_code_and_validate_response(request_rec *r,
364366 apr_table_set (params , OIDC_PROTO_REFRESH_TOKEN , refresh_token );
365367 }
366368
369+ if (scope != NULL ) {
370+ apr_table_set (params , OIDC_PROTO_SCOPE , scope );
371+ }
372+
367373 return TRUE;
368374}
369375
@@ -393,6 +399,7 @@ apr_byte_t oidc_proto_response_code_idtoken(request_rec *r, oidc_cfg_t *c, oidc_
393399 apr_table_unset (params , OIDC_PROTO_TOKEN_TYPE );
394400 apr_table_unset (params , OIDC_PROTO_EXPIRES_IN );
395401 apr_table_unset (params , OIDC_PROTO_REFRESH_TOKEN );
402+ apr_table_unset (params , OIDC_PROTO_SCOPE );
396403
397404 if (oidc_proto_resolve_code_and_validate_response (r , c , provider , response_type , params , proto_state ) == FALSE)
398405 return FALSE;
@@ -420,6 +427,7 @@ apr_byte_t oidc_proto_response_code_token(request_rec *r, oidc_cfg_t *c, oidc_pr
420427 /* clear parameters that should only be set from the token endpoint */
421428 apr_table_unset (params , OIDC_PROTO_ID_TOKEN );
422429 apr_table_unset (params , OIDC_PROTO_REFRESH_TOKEN );
430+ apr_table_unset (params , OIDC_PROTO_SCOPE );
423431
424432 if (oidc_proto_resolve_code_and_validate_response (r , c , provider , response_type , params , proto_state ) == FALSE)
425433 return FALSE;
@@ -454,6 +462,7 @@ apr_byte_t oidc_proto_response_code(request_rec *r, oidc_cfg_t *c, oidc_proto_st
454462 apr_table_unset (params , OIDC_PROTO_EXPIRES_IN );
455463 apr_table_unset (params , OIDC_PROTO_ID_TOKEN );
456464 apr_table_unset (params , OIDC_PROTO_REFRESH_TOKEN );
465+ apr_table_unset (params , OIDC_PROTO_SCOPE );
457466
458467 if (oidc_proto_resolve_code_and_validate_response (r , c , provider , response_type , params , proto_state ) == FALSE)
459468 return FALSE;
@@ -520,6 +529,7 @@ apr_byte_t oidc_proto_response_code_idtoken_token(request_rec *r, oidc_cfg_t *c,
520529
521530 /* clear parameters that should only be set from the token endpoint */
522531 apr_table_unset (params , OIDC_PROTO_REFRESH_TOKEN );
532+ apr_table_unset (params , OIDC_PROTO_SCOPE );
523533
524534 if (oidc_proto_resolve_code_and_validate_response (r , c , provider , response_type , params , proto_state ) == FALSE)
525535 return FALSE;
0 commit comments