Search code examples
c#asynchronousasync-awaitaccess-tokenunauthorized

Even with a successful access Token I get a 401 unauthorized in my Get() async method?


Currently I have to async methods Post() & Get(). For my Post() method is returning a access token and if you look at the bottom of my post method I am calling my Get() in there also, for the simple reason of being able to call string result in my get. but even with a successful access token I Keep getting a 401 unauthorized Status code, why?
Click to view error in VS

 namespace APICredential.Controllers
    {
        [RoutePrefix("api")]
        public class ValuesController : ApiController
        {

            [HttpGet, Route("values")]
            public async Task<string> Post()
            {
                using (HttpClient client = new HttpClient())
                {
                    client.BaseAddress = new Uri("https://api.elliemae.com/oauth2/");

                    var parameters = new Dictionary<string, string>()
                    {
                        {"grant_type", "password"}, //Gran_type Identified here
                        {"username", "admin@encompass:BE11200822"},
                        {"password", "Shmmar****"},
                        {"client_id", "gpq4sdh"},
                        {"client_secret", "dcZ42Ps0lyU0XRgpDyg0yXxxXVm9@A5Z4ICK3NUN&DgzR7G2tCOW6VC#HVoZPBwU"},
                        {"scope", "lp"}
                    };

                    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "v1/token")

                    {
                        Content = new FormUrlEncodedContent(parameters)
                    };

                    HttpResponseMessage response = await client.SendAsync(request);

                    string resulted = await response.Content.ReadAsStringAsync();
                   await Get(resulted);
                    return resulted;
                }
            }


            [HttpGet, Route("values/get")]
            public async Task<string> Get(string resulted)
            {

                string res = "";
                using (var client = new HttpClient())
                {
                    // HTTP POST

                    client.BaseAddress = new Uri("https://api.elliemae.com/");             
                    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                    var response = client.GetAsync("/encompass/v1/loans/{ea7c29a6-ee08-4816-99d2-fbcc7d15731d}?Authorization=Bearer "+resulted+"&Content-Type=application/json").Result;

                    using (HttpContent content = response.Content)
                    {
                        // ... Read the string.
                        Task<string> result = content.ReadAsStringAsync();
                        res = result.Result;
                    }
                }
                return res;
            }

Solution

  • The following is missing:

    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + Accesstoken);
    

    This is your default header once you insert this then you have premission to getstring data from whatever your URL is...

    code will look like this:

     public async Task<string> Get(string Accesstoken)
        {
             string res = "";
             using (var client = new HttpClient())
            {
                Accesstoken = Accesstoken.Substring(17, 28);
                client.BaseAddress = new Uri("https://api.elliemae.com/");
                client.DefaultRequestHeaders.Add("Authorization", "Bearer " + Accesstoken);
                var response = client.GetAsync("encompass/v1/loans/ea7c29a6-ee08-4816-99d2-fbcc7d15731d").Result;
                using (HttpContent content = response.Content)
                {
                    // ... Read the string.
                    Task<string> result = content.ReadAsStringAsync();
                    res = result.Result;
                }