Как диагностировать ошибку 401 при попытке получить токен-носитель OAuth2 в c#. NET Core? - PullRequest
3 голосов
/ 05 февраля 2020

У меня есть некоторые ограниченные навыки в c++, и недавно я перешел в C# (asp.net) и azure Web services. Как Po C я пытаюсь сделать REST звонки на PayPal (которые мне нужно будет использовать профессионально через 3-6 месяцев).

Я настроил свой личный PayPal учетная запись, используя инструкции здесь , и я получаю токен на предъявителя, используя curl, как описано в ссылке. Потрясающие.

Я сейчас пытаюсь сделать это с .NET Core C#, и все, что я получаю, это 401 error. Я изучил запрос, и он выглядит так же, как curl с точки зрения заголовков; base64 закодированные учетные данные, которые, я думаю, я добавляю, такие же, как и в подробном журнале скручивания (я рассмотрел две строки base64 на глаз), поэтому это должно быть то, что я делаю (или не делаю) в установка вызова. Я ищу предложения, указатели или смех над очевидной ошибкой, которую я сделал.

Я настроил так называемого клиента таким образом:

 public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddHttpClient("PayPal", c =>
            {
                c.BaseAddress = new Uri("https://api.sandbox.paypal.com/v1/");
                c.DefaultRequestHeaders.Add("Accept", "application/json");
                c.DefaultRequestHeaders.Add("Accept-Language", "en_US");
            });

(со всеми остальными вещами, которые поставляются бесплатно с VS, для краткости он опущен).

Я пытаюсь позвонить таким образом:

           string clientCredString = CLIENTID + ":" + SECRET;
            var clientCreds = System.Text.Encoding.UTF8.GetBytes(clientCredString);
            var client = _clientFactory.CreateClient("PayPal");
            client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", System.Convert.ToBase64String(clientCreds));
            var messageBody = new Dictionary<string,string > ();
            messageBody.Add("grant_type", "client_credientials");
            var request = new HttpRequestMessage(HttpMethod.Get, "oauth2/token")
            {
                Content = new FormUrlEncodedContent(messageBody)
            };
            string token;
            var response = await client.SendAsync(request);
            if (response.IsSuccessStatusCode)
            {
                var json = await response.Content.ReadAsStringAsync();
                token = JsonConvert.DeserializeObject<string>(json);

            }
            else 
            {
                throw new ApplicationException("Well that failed");
            }

и получаю 401 код для моей проблемы.

Предложения по устранению неполадок, более эффективные способы сделать это и смех над моей глупостью все приветствуется.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Для будущих читателей:

Как и предполагалось, это была проблема с кодировкой. Строка:

var clientCreds = System.Text.Encoding.UTF8.GetBytes(clientCredString);

должна быть

var clientCreds = System.Text.Encoding.ASCII.GetBytes(clientCredString);

Следует также отметить, что эта конкретная операция требует POST, а не GET, как я использовал, но как только я начал отправлять правильно закодированные запросы, ошибки стали более понятными.

0 голосов
/ 05 февраля 2020

Обновление:

Я прочитал документацию, несколько элементов выделяются для меня:

  • Требуется глагол сообщения.
  • Использует FormUrlEncodedContent для учетных данных клиента.
  • Basi c Для аутентификации требуются имя пользователя и пароль (Client Id & Secret)

Я считаю, что синтаксис должен быть:

var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Post, "...");
request.Content = new Dictionary<string, string>() { "grant_type", "client_credentials" };
request.Headers.Authorization = new AuthenticationHeaderValue("Basic", $"{Encoding.UTF8.GetBytes($"{id}:{secret}")}");
HttpResponseMEssage = response = await client.PostAsync(request);

response.EnsureSuccessStatusCode();
var content = await response.Content.ReadAsStringAsync();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...