@@ -66,7 +66,7 @@ ca/T0LLtgmbMmxSv/MmzIg==
6666    nonce, 
6767    keyPair =  DEFAULT . keyPair , 
6868    onParRequest, 
69-     backchannelAuth 
69+     onBackchannelAuthRequest 
7070  } : { 
7171    tokenEndpointResponse ?: oauth . TokenEndpointResponse  |  oauth . OAuth2Error ; 
7272    tokenEndpointErrorResponse ?: oauth . OAuth2Error ; 
@@ -76,10 +76,7 @@ ca/T0LLtgmbMmxSv/MmzIg==
7676    nonce ?: string ; 
7777    keyPair ?: jose . GenerateKeyPairResult ; 
7878    onParRequest ?: ( request : Request )  =>  Promise < void > ; 
79-     backchannelAuth ?: { 
80-       interval : number ; 
81-       expiresIn : number ; 
82-     } ; 
79+     onBackchannelAuthRequest ?: ( request : Request )  =>  Promise < void > ; 
8380  }  =  { } )  { 
8481    // this function acts as a mock authorization server 
8582    return  vi . fn ( 
@@ -137,7 +134,6 @@ ca/T0LLtgmbMmxSv/MmzIg==
137134        // PAR endpoint 
138135        if  ( url . pathname  ===  "/oauth/par" )  { 
139136          if  ( onParRequest )  { 
140-             // TODO: for some reason the input here is a URL and not a request 
141137            await  onParRequest ( new  Request ( input ,  init ) ) ; 
142138          } 
143139
@@ -150,11 +146,15 @@ ca/T0LLtgmbMmxSv/MmzIg==
150146        } 
151147        // Backchannel Authorize endpoint 
152148        if  ( url . pathname  ===  "/bc-authorize" )  { 
149+           if  ( onBackchannelAuthRequest )  { 
150+             await  onBackchannelAuthRequest ( new  Request ( input ,  init ) ) ; 
151+           } 
152+ 
153153          return  Response . json ( 
154154            { 
155155              auth_req_id : "auth-req-id" , 
156-               expires_in : backchannelAuth ?. expiresIn   ??   30 , 
157-               interval : backchannelAuth ?. interval   ??   0.01 
156+               expires_in : 30 , 
157+               interval : 0.01 
158158            } , 
159159            { 
160160              status : 200 
@@ -5744,6 +5744,159 @@ ca/T0LLtgmbMmxSv/MmzIg==
57445744      ) ; 
57455745      expect ( res ) . toBeNull ( ) ; 
57465746    } ) ; 
5747+ 
5748+     it ( "should forward any statically configured authorization parameters" ,  async  ( )  =>  { 
5749+       const  customScope  =  "openid profile email offline_access custom_scope" ; 
5750+       const  customAudience  =  "urn:mystore:api" ; 
5751+       const  customParamValue  =  "custom_value" ; 
5752+ 
5753+       const  secret  =  await  generateSecret ( 32 ) ; 
5754+       const  transactionStore  =  new  TransactionStore ( { 
5755+         secret
5756+       } ) ; 
5757+       const  sessionStore  =  new  StatelessSessionStore ( { 
5758+         secret
5759+       } ) ; 
5760+       const  authClient  =  new  AuthClient ( { 
5761+         transactionStore, 
5762+         sessionStore, 
5763+ 
5764+         domain : DEFAULT . domain , 
5765+         clientId : DEFAULT . clientId , 
5766+         clientSecret : DEFAULT . clientSecret , 
5767+ 
5768+         secret, 
5769+         appBaseUrl : DEFAULT . appBaseUrl , 
5770+ 
5771+         routes : getDefaultRoutes ( ) , 
5772+         authorizationParameters : { 
5773+           scope : customScope , 
5774+           audience : customAudience , 
5775+           custom_param : customParamValue 
5776+         } , 
5777+         fetch : getMockAuthorizationServer ( { 
5778+           onBackchannelAuthRequest : async  ( req )  =>  { 
5779+             const  formBody  =  await  req . formData ( ) ; 
5780+             expect ( formBody . get ( "scope" ) ) . toEqual ( customScope ) ; 
5781+             expect ( formBody . get ( "audience" ) ) . toEqual ( customAudience ) ; 
5782+             expect ( formBody . get ( "custom_param" ) ) . toEqual ( customParamValue ) ; 
5783+           } 
5784+         } ) 
5785+       } ) ; 
5786+ 
5787+       const  [ error ,  _ ]  =  await  authClient . backchannelAuthentication ( { 
5788+         bindingMessage : "test-message" , 
5789+         loginHint : { 
5790+           sub : DEFAULT . sub 
5791+         } 
5792+       } ) ; 
5793+ 
5794+       expect ( error ) . toBeNull ( ) ; 
5795+     } ) ; 
5796+ 
5797+     it ( "should forward any dynamically specified authorization parameters" ,  async  ( )  =>  { 
5798+       const  customScope  =  "openid profile email offline_access custom_scope" ; 
5799+       const  customAudience  =  "urn:mystore:api" ; 
5800+       const  customParamValue  =  "custom_value" ; 
5801+ 
5802+       const  secret  =  await  generateSecret ( 32 ) ; 
5803+       const  transactionStore  =  new  TransactionStore ( { 
5804+         secret
5805+       } ) ; 
5806+       const  sessionStore  =  new  StatelessSessionStore ( { 
5807+         secret
5808+       } ) ; 
5809+       const  authClient  =  new  AuthClient ( { 
5810+         transactionStore, 
5811+         sessionStore, 
5812+ 
5813+         domain : DEFAULT . domain , 
5814+         clientId : DEFAULT . clientId , 
5815+         clientSecret : DEFAULT . clientSecret , 
5816+ 
5817+         secret, 
5818+         appBaseUrl : DEFAULT . appBaseUrl , 
5819+ 
5820+         routes : getDefaultRoutes ( ) , 
5821+         fetch : getMockAuthorizationServer ( { 
5822+           onBackchannelAuthRequest : async  ( req )  =>  { 
5823+             const  formBody  =  await  req . formData ( ) ; 
5824+             expect ( formBody . get ( "scope" ) ) . toEqual ( customScope ) ; 
5825+             expect ( formBody . get ( "audience" ) ) . toEqual ( customAudience ) ; 
5826+             expect ( formBody . get ( "custom_param" ) ) . toEqual ( customParamValue ) ; 
5827+           } 
5828+         } ) 
5829+       } ) ; 
5830+ 
5831+       const  [ error ,  _ ]  =  await  authClient . backchannelAuthentication ( { 
5832+         bindingMessage : "test-message" , 
5833+         loginHint : { 
5834+           sub : DEFAULT . sub 
5835+         } , 
5836+         authorizationParams : { 
5837+           scope : customScope , 
5838+           audience : customAudience , 
5839+           custom_param : customParamValue 
5840+         } 
5841+       } ) ; 
5842+ 
5843+       expect ( error ) . toBeNull ( ) ; 
5844+     } ) ; 
5845+ 
5846+     it ( "should give precedence to dynamically provided authorization parameters over statically configured ones" ,  async  ( )  =>  { 
5847+       const  customScope  =  "openid profile email offline_access custom_scope" ; 
5848+       const  customParamValue  =  "custom_value" ; 
5849+ 
5850+       const  secret  =  await  generateSecret ( 32 ) ; 
5851+       const  transactionStore  =  new  TransactionStore ( { 
5852+         secret
5853+       } ) ; 
5854+       const  sessionStore  =  new  StatelessSessionStore ( { 
5855+         secret
5856+       } ) ; 
5857+       const  authClient  =  new  AuthClient ( { 
5858+         transactionStore, 
5859+         sessionStore, 
5860+ 
5861+         domain : DEFAULT . domain , 
5862+         clientId : DEFAULT . clientId , 
5863+         clientSecret : DEFAULT . clientSecret , 
5864+ 
5865+         secret, 
5866+         appBaseUrl : DEFAULT . appBaseUrl , 
5867+ 
5868+         routes : getDefaultRoutes ( ) , 
5869+         authorizationParameters : { 
5870+           scope : customScope , 
5871+           audience : "static-config-aud" , 
5872+           custom_param : customParamValue 
5873+         } , 
5874+         fetch : getMockAuthorizationServer ( { 
5875+           onBackchannelAuthRequest : async  ( req )  =>  { 
5876+             const  formBody  =  await  req . formData ( ) ; 
5877+             expect ( formBody . get ( "scope" ) ) . toEqual ( customScope ) ; 
5878+             expect ( formBody . get ( "audience" ) ) . toEqual ( 
5879+               "dynamically-specific-aud" 
5880+             ) ; 
5881+             expect ( formBody . get ( "custom_param" ) ) . toEqual ( customParamValue ) ; 
5882+           } 
5883+         } ) 
5884+       } ) ; 
5885+ 
5886+       const  [ error ,  _ ]  =  await  authClient . backchannelAuthentication ( { 
5887+         bindingMessage : "test-message" , 
5888+         loginHint : { 
5889+           sub : DEFAULT . sub 
5890+         } , 
5891+         authorizationParams : { 
5892+           scope : customScope , 
5893+           audience : "dynamically-specific-aud" , 
5894+           custom_param : customParamValue 
5895+         } 
5896+       } ) ; 
5897+ 
5898+       expect ( error ) . toBeNull ( ) ; 
5899+     } ) ; 
57475900  } ) ; 
57485901} ) ; 
57495902
0 commit comments