Ошибка «invalid_grant» из API DocuSign токена из Angular SPA - PullRequest
1 голос
/ 05 июня 2019

Я использую приведенный ниже код для получения токена доступа и обновления токена из docusign.Но я всегда получаю ошибку недействительного гранта.Я вставляю код ниже.

    [HttpGet("GetDocToken")]
    [AllowAnonymous]
    public async Task<IActionResult> getToken(string docCode)
    {
        var x = docCode.Length;
        var client = new HttpClient();
        var authCode=Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("ced8998a-4387-4f30-9ab7-51c0d1af49bf:d7c3ccd4-22fa-4f18-a540-ddf11d8b2c9f"));
        client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", authCode);
        client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));

        var requestContent = new FormUrlEncodedContent(new[] {
            new KeyValuePair<string, string>("grant_type", "authorization_code"),
            new KeyValuePair<string, string>("code", docCode),
            new KeyValuePair<string, string>("redirect_uri", "http://localhost:4200/auth")
        });

        HttpResponseMessage response = await client.PostAsync("https://account-d.docusign.com/oauth/token", requestContent);
        string resultContent = response.Content.ReadAsStringAsync().Result;
        return Ok(response.Content.ReadAsStringAsync());
    }

1 Ответ

1 голос
/ 05 июня 2019

Я предполагаю, что вы получили код аутентификации из системы идентификации DocuSign и пытаетесь обменять его на токен доступа.

Пара вопросов:

docs неправильно указывает, что redirect_uri должен быть включен в запрос. Пример запроса в документации правильно показывает, что запрос должен включать только параметры grant_type и code.

Примечание. Хотя стандарт OAuth , раздел 4.1 (d) действительно указывает на то, что redirect_url должен быть включен, DocuSign обычно его не включает.

Я предполагаю, что DocuSign будет игнорировать параметр redirect_uri, но вы можете попытаться пропустить его.

Другая проблема связана со временем : код авторизации, полученный вами от DocuSign, действителен только в течение минуты или около того. Если вы не сразу используете код авторизации (ваш код docCode), вы получите ошибку Invalid Grant.

Известный хороший пример программного обеспечения

Я предлагаю вам также проверить пример известного кода для C # . Вы можете использовать протокол просмотра, чтобы увидеть, что именно он делает во время аутентификации.

Использовать библиотеку

Я также предлагаю вам поискать клиентскую библиотеку OAuth-кода авторизации, которую вы можете использовать вместо того, чтобы использовать свою собственную.

Например, вы устанавливаете и проверяете значение состояния? Это важно сделать, чтобы остановить CSRF-атаки. Смотрите эту статью .

Добавлена ​​

Мне также не ясно, что вы используете правильное значение в качестве authorization code.

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

  1. Пользователь нажимает «Аутентификация с DocuSign» в приложении Angular.
  2. Браузер пользователя выполняет GET для сервера аутентификации DocuSign. На данный момент в браузере больше не работает приложение Angular.
  3. Браузер пользователя и сервер аутентификации DocuSign обмениваются HTML назад и вперед при аутентификации пользователя с помощью DocuSign.
  4. Пользователь завершает процесс аутентификации с помощью DocuSign.
  5. DocuSign отправляет браузеру ответ REDIRECT, сообщая браузеру выполнить GET для URL перенаправления. Перенаправление (и GET) включает параметры запроса для code и state
  6. Ваш СЕРВЕР (не приложение Angular) получает запрос GET.
  7. Ваш сервер должен:
    1. Извлечение параметров запроса code и state
    2. Убедитесь, что state совпадает с отправленным на шаге 2.
    3. Делает POST-запрос к DocuSign для обмена кода авторизации на токен доступа.
    4. ОТВЕЧАЕТ браузеру с помощью программы Angular.
  8. Программа Angular снова запущена в браузере.

Использование неявного гранта

Другой вариант - использовать неявное предоставление. Таким образом, вам не нужен серверный компонент. С помощью Implicit Grant ваша угловая программа обрабатывает поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...