1010using System . Text ;
1111using System . Text . Json ;
1212using System . Threading . Tasks ;
13+ using System . Web ;
1314
1415namespace PnP . PowerShell . Commands . Base
1516{
@@ -319,25 +320,32 @@ private static async Task<string> GetFederationTokenFromGithubAsync()
319320 {
320321 Framework . Diagnostics . Log . Debug ( "TokenHandler" , "Retrieving GitHub federation token..." ) ;
321322
322- var requestUrl = $ "{ Environment . GetEnvironmentVariable ( "ACTIONS_ID_TOKEN_REQUEST_URL" ) } &audience={ Uri . EscapeDataString ( "api://AzureADTokenExchange" ) } ";
323+ var requestUrl = $ "{ Environment . GetEnvironmentVariable ( "ACTIONS_ID_TOKEN_REQUEST_URL" ) } &audience={ UrlUtilities . UrlEncode ( "api://AzureADTokenExchange" ) } ";
323324
324325 var httpClient = Framework . Http . PnPHttpClient . Instance . GetHttpClient ( ) ;
325326
326327 using var requestMessage = new HttpRequestMessage ( HttpMethod . Get , requestUrl ) ;
327328 requestMessage . Headers . Authorization = new System . Net . Http . Headers . AuthenticationHeaderValue ( "Bearer" , Environment . GetEnvironmentVariable ( "ACTIONS_ID_TOKEN_REQUEST_TOKEN" ) ) ;
328329 requestMessage . Headers . Add ( "Accept" , "application/json" ) ;
329330 requestMessage . Headers . Add ( "x-anonymous" , "true" ) ;
331+
330332 var response = await httpClient . SendAsync ( requestMessage ) ;
333+ var responseContent = await response . Content . ReadAsStringAsync ( ) ;
331334
332- response . EnsureSuccessStatusCode ( ) ;
335+ if ( ! response . IsSuccessStatusCode )
336+ {
337+ responseContent = responseContent . Replace ( "{" , "{{" ) . Replace ( "}" , "}}" ) ;
338+ throw new HttpRequestException ( $ "Failed to retrieve GitHub federation token. HTTP Error { response . StatusCode } : { responseContent } ") ;
339+ }
333340
334- var content = await response . Content . ReadAsStringAsync ( ) ;
335- var tokenResponse = JsonSerializer . Deserialize < Dictionary < string , object > > ( content ) ;
341+ Framework . Diagnostics . Log . Debug ( "TokenHandler" , "Successfully retrieved GitHub federation token..." ) ;
342+ var tokenResponse = JsonSerializer . Deserialize < Dictionary < string , object > > ( responseContent ) ;
336343
337344 return tokenResponse [ "value" ] . ToString ( ) ;
338345 }
339346 catch ( Exception ex )
340347 {
348+ Framework . Diagnostics . Log . Error ( "TokenHandler GitHub" , ex . Message ) ;
341349 throw new PSInvalidOperationException ( $ "Failed to retrieve GitHub federation token: { ex . Message } ", ex ) ;
342350 }
343351 }
@@ -360,15 +368,22 @@ private static async Task<string> GetFederationTokenFromAzureDevOpsAsync(string
360368 requestMessage . Headers . Add ( "x-anonymous" , "true" ) ;
361369
362370 var response = await httpClient . SendAsync ( requestMessage ) ;
363- response . EnsureSuccessStatusCode ( ) ;
364371
365- var content = await response . Content . ReadAsStringAsync ( ) ;
366- var tokenResponse = JsonSerializer . Deserialize < Dictionary < string , object > > ( content ) ;
372+ var responseContent = await response . Content . ReadAsStringAsync ( ) ;
373+ if ( ! response . IsSuccessStatusCode )
374+ {
375+ responseContent = responseContent . Replace ( "{" , "{{" ) . Replace ( "}" , "}}" ) ;
376+ throw new HttpRequestException ( $ "Failed to retrieve Azure DevOps federation token. HTTP Error { response . StatusCode } : { responseContent } ") ;
377+ }
378+
379+ Framework . Diagnostics . Log . Debug ( "TokenHandler" , "Successfully retrieved Azure DevOps federation token..." ) ;
380+ var tokenResponse = JsonSerializer . Deserialize < Dictionary < string , object > > ( responseContent ) ;
367381
368382 return tokenResponse [ "oidcToken" ] . ToString ( ) ;
369383 }
370384 catch ( Exception ex )
371385 {
386+ Framework . Diagnostics . Log . Error ( "TokenHandler AzureDevOps" , ex . Message ) ;
372387 throw new PSInvalidOperationException ( $ "Failed to retrieve Azure DevOps federation token: { ex . Message } ", ex ) ;
373388 }
374389 }
@@ -383,9 +398,9 @@ private static async Task<string> GetAccessTokenWithFederatedTokenAsync(string c
383398 var queryParams = new List < string >
384399 {
385400 "grant_type=client_credentials" ,
386- $ "scope={ resource } ",
401+ $ "scope={ HttpUtility . UrlEncode ( resource ) } ",
387402 $ "client_id={ clientId } ",
388- $ "client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
403+ $ "client_assertion_type={ HttpUtility . UrlEncode ( " urn:ietf:params:oauth:client-assertion-type:jwt-bearer" ) } ",
389404 $ "client_assertion={ federatedToken } "
390405 } ;
391406
@@ -402,8 +417,11 @@ private static async Task<string> GetAccessTokenWithFederatedTokenAsync(string c
402417 var responseContent = await response . Content . ReadAsStringAsync ( ) ;
403418 if ( ! response . IsSuccessStatusCode )
404419 {
405- throw new HttpRequestException ( $ "Failed to retrieve federated access token: HTTP Error { response . StatusCode } : { responseContent } ") ;
420+ responseContent = responseContent . Replace ( "{" , "{{" ) . Replace ( "}" , "}}" ) ;
421+ throw new HttpRequestException ( $ "Failed to retrieve federated access token. HTTP Error { response . StatusCode } : { responseContent } ") ;
406422 }
423+
424+ Framework . Diagnostics . Log . Debug ( "TokenHandler" , "Successfully retrieved federated access token..." ) ;
407425 var tokenResponse = JsonSerializer . Deserialize < Dictionary < string , object > > ( responseContent ) ;
408426
409427 return tokenResponse [ "access_token" ] . ToString ( ) ;
0 commit comments