Skip to content

Commit e9c3694

Browse files
gautamdshethGautam Sheth
andauthored
Improve logging in federated credentials (#4982)
Co-authored-by: Gautam Sheth <gautam.sheth@staffbase.com>
1 parent 29deda3 commit e9c3694

File tree

1 file changed

+28
-10
lines changed

1 file changed

+28
-10
lines changed

src/Commands/Base/TokenHandler.cs

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using System.Text;
1111
using System.Text.Json;
1212
using System.Threading.Tasks;
13+
using System.Web;
1314

1415
namespace 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

Comments
 (0)