1

I have a C# method a calling service to retrieve the access_token, how do I pull that value from response returned?

try {
            var client = new HttpClient();
            client.BaseAddress = new Uri(_serviceConfig.DataGapsBaseUrl);
            var request = new HttpRequestMessage(HttpMethod.Post, "/dataopssecurity/oauth2/token");

            var formData = new List<KeyValuePair<string, string>>();
            formData.Add(new KeyValuePair<string, string>("grant_type", _serviceConfig.grantType));
            formData.Add(new KeyValuePair<string, string>("username", _serviceConfig.username));
            formData.Add(new KeyValuePair<string, string>("password", _serviceConfig.password));
            formData.Add(new KeyValuePair<string, string>("scope", _serviceConfig.scope));

            request.Content = new FormUrlEncodedContent(formData);
            var authenticationString = $"{Username}:{Password}";
            request.Headers.Authorization = new AuthenticationHeaderValue(
            scheme: "Basic",
            parameter: Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(authenticationString)));
            //client.DefaultRequestHeaders.Add($"Authorization", $"Basic {Convert.ToBase64String($"{Username}:{Password}")}");
            var response = await client.SendAsync(request);

How do I something like var bearToken = Response["access_token"] ?

Json Returned:

{
    "access_token": "eyJraWQiOiIxNDA2ZGQ3MC0zOWQ4LTRjOGItYjI1Mi0yM2RhZjk0Mjg0NTMiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJjZGlzcG9sbGluZ3N2YyIsImF1ZCI6ImRhdGFvcHNzdWl0ZS1jbGktY2xpZW50IiwidXNlci1hdXRob3JpdGllcyI6WyJ2aWV3LXRlbXBsYXRlIiwiZWRpdC1waXBlbGluZSIsImVkaXQtZGF0YS1zb3VyY2UiLCJ2aWV3LWRhdGFzZXQiLCJlZGl0LWF6dXJlLWNsdXN0ZXIiLCJlZGl0LWRvbWFpbnMiLCJkYXRhZmxvdy1kYXRhLXJ1bGUiLCJ2aWV3LWRhdGEtcXVhbGl0eS1ydWxlIiwiZGF0YWZsb3ctZGF0YS1jb21wYXJlIiwidmlldy1kYXRhLXNvdXJjZSIsInZpZXctZGF0YWZsb3ciLCJ2aWV3LWRvbWFpbnMiLCJ2aWV3LWxpdnlzZXJ2ZXIiLCJ2aWV3LWF6dXJlLXRlc3RwbGFuIiwidmlldy1kYXRhLW1vZGVsIiwiZWRpdC1kYXRhc2V0Iiwidmlldy1henVyZS1jbHVzdGVyIiwiZWRpdC1henVyZS10ZXN0cGxhbiIsImVkaXQtcmVwb3J0IiwiZWRpdC1kYXRhLXF1YWxpdHktcnVsZSIsInZpZXctc2NoZWR1bGVyIiwidmlldy1zdWJqZWN0LWFyZWEiLCJlZGl0LWRhdGFmbG93Iiwidmlldy1yZXBvcnQiLCJydW4tdGVzdGNhc2UiLCJlZGl0LWxpdnlzZXJ2ZXIiLCJ2aWV3LWVtci1jbHVzdGVyIiwiZGF0YWZsb3ctZGF0YS1vYnNlcnZhYmlsaXR5IiwiZWRpdC1kYXRhLW1vZGVsIiwicnVuLXBpcGVsaW5lIiwiZWRpdC1lbXItY2x1c3RlciIsInZpZXctcGlwZWxpbmUiLCJlZGl0LXRlbXBsYXRlIiwiZGF0YWZsb3ctbWV0YWRhdGEtY29tcGFyZSIsImVkaXQtc3ViamVjdC1hcmVhIiwiZGF0YWZsb3ctZGF0YS1wcm9maWxlIiwiZGF0YWZsb3ctbWV0cmljLWNvbXBhcmUiLCJydW4tZGF0YWZsb3ciLCJlZGl0LXNjaGVkdWxlciIsInZpZXctdGVzdGNhc2UiLCJlZGl0LXRlc3RjYXNlIl0sIm5iZiI6MTY4MDE5MDIyNiwic2NvcGUiOlsib3BlbmlkIl0sImlzcyI6Imh0dHA6XC9cLzEwLjIzNy4wLjQ6NjA1NVwvZGF0YW9wc3NlY3VyaXR5IiwiZXhwIjoxNjgwMjc2NjI2LCJpYXQiOjE2ODAxOTAyMjZ9.SKhyBhRAgMkgdS5PbZ3xg6NBu5Kk0NSpYakcYJUfEPbf9GE8gTPCv1iJFQWJd5qxMbcL6DFs-2jP8SQ8UvJ6MiVFsTw5e09zspNgeV77Q_1dGgkghNHxU8r164eDI6Cp9GtTLFpwyAgW4o9HBE0A7jXk7w_vGJVEEpT-Wl7WpyHDCXBPOb2_yxIfLH1qhA00SrORTt555DPLM1ZkpRf1njeBTHRNVahReD5r3Bigp1pxWftFBFPoNMDhTpZrFqMQ1reKsmZOKUoOHCi2AtEDPEAzPwYS31i-R8Rd4wbZE3moJtj9SPN70YgT1yngt-HT4zYSaIfxG1wodhSAz5Izrw",
    "refresh_token": "KJSh8AkLmdOPxD2nzMAyeDel4Dai7UxWiftS4wUxjNw_LjGvuQK5dj2cTKgWLjeRkxzkLoQKmng5iLpUMSKVrZ_lzGSPHeedaAI6GBdKcraLzKdm7t69hA1q6jVvLGn7",
    "scope": "openid",
    "token_type": "Bearer",
    "expires_in": 86400
}
Charlieface
  • 52,284
  • 6
  • 19
  • 43
Chaka
  • 1,709
  • 11
  • 33
  • 58
  • Does this answer your question? [Receiving JSON data back from HTTP request](https://stackoverflow.com/questions/10928528/receiving-json-data-back-from-http-request) – Charlieface Mar 31 '23 at 01:03
  • Side note: `client` should be cached in a static field to prevent socket exhaustion, and `request` and `response` need `using` to dispose them – Charlieface Mar 31 '23 at 01:05

1 Answers1

2

Possible solution is to deserialize the response into an object and read the property of the object.

string content = !response.IsSuccessStatusCode
       ? null
       : response.Content.ReadAsStringAsync().Result;

TokenResponse tokenResponse = JsonConvert.DeserializeObject<TokenResponse>(content);
string accessToken = tokenResponse.access_token;

The 'TokenResponse' object can be as simple as an object with just the 'access_token' property.

As an alternative you can use Json.net or the MS Json libraries to read the value from the Json.

Björn Boxstart
  • 1,098
  • 1
  • 12
  • 25
  • It is immensely provoking me that I have to declare a nice C# class and have the name of the property forced to be both lower cased and snake cased like *access_token*. Even if I pass in deserialisation options for voiding the case congruency, I still have this annoying underscore. Also, creating a whole class for a single stupid property is... well... stupid. :D – Konrad Viltersten Jul 13 '23 at 16:56