Поток предоставления кода авторизации DocuSign получает ошибку invalid_grant

Документация DocuSign проходит простой процесс авторизации для предоставления кода. Я могу получить "код" из первоначального запроса GET в /oath/auth, но получение токенов выдает ошибку "invalid_grant" при попытке в почтальоне. Я выполнил шаги и получил запрос, который выглядит следующим образом, используя account-d.docusign.com для хоста:

POST /oauth/token
Content-Type: application/x-www-form-urlencoded
Authorization: Basic MjMwNTQ2YTctOWM1NS00MGFkLThmYmYtYWYyMDVkNTQ5NGFkOjMwODc1NTVlLTBhMWMtNGFhOC1iMzI2LTY4MmM3YmYyNzZlOQ==

grant_type=authorization_code&code=ey2dj3nd.AAAA39djasd3.dkn4449d21d

Два других члена моей команды также пытались использовать свои учетные записи разработчиков, и все они получают ошибки invalid_grant. Это больше не поддерживается или есть общие ошибки, связанные с этой ошибкой, которые мы могли бы исследовать?

7 ответов

Перепроверьте все ваши ценности.

Я также получал тот же ответ invalid_grant и не мог понять почему сначала. Оказывается, у меня была опечатка в заголовке Content-Type. Я использовал application/x-www-form-urlencode вместо application/x-www-form-urlencoded.

Возможно, это не так, но если вы отправляете точный заголовок авторизации в том виде, в котором вы разместили его здесь в своем вопросе (MjMwNTQ2YTctOWM1NS00MGFkLThmYmYtYWYyMDVkNTQ5NGFkOjMwODc1NTVlLTBhMWMtNGFhMLHIHYMYYMYZYMYZYMYMZYMYZZ)

Это значение base64 для примера ключа интеграции и образца секретного ключа, приведенных в их документации. Если вы расшифруете эту строку с помощью онлайн-декодера base64, это приведет к 230546a7-9c55-40ad-8fbf-af205d5494ad:3087555e-0a1c-4aa8-b326-682c7bf276e9. Это тот же пример ключа интеграции и секрет в документации.

Проверьте отправляемый вами заголовок авторизации, закодировав свой ключ интеграции и секретный ключ ( grationKey : секретный) с помощью этого онлайнового base64encoder. Это позволит убедиться, что проблема не в вашей кодировке base64, а в ключе и секрете интеграции. После того, как вы получите это значение, убедитесь, что в вашем Авторизации используется слово Basic до значения, полученного с этого сайта. (Базовая base64stringFromOnlineEncoder)

Убедитесь, что код, который вы отправляете в теле поста, не является примером кода из их документации. ey2dj3nd.AAAA39djasd3.dkn4449d21d - это пример кода из их документации. Вы можете просто использовать это в своем вопросе в качестве заполнителя, но если вы отправляете любое из этих значений, оно вернет invalid_grant. Убедитесь, что в теле вашего поста нет пробелов.

  1. Иметь правильное приложение Content-Type / x-www-form-urlencoded
  2. Иметь правильный набор заголовков авторизации. Basic base64EncodedIntegrationKey:Secret
  3. Получите правильное тело, используя правильный код, полученный из запроса GET для /oauth/auth без пробелов в начале и в конце, убедившись, что вы не используете значения из своего вопроса.

Если у вас по-прежнему возникают проблемы и вы не создаете пользовательское приложение, а выполняете интеграцию служб, вы можете использовать Legacy Authentication для получения вашего токена oAuth2.

Альтернативный метод с использованием устаревшей аутентификации для интеграции сервисов

Этот метод не использует код предоставления. Вы передаете ключ интеграции, имя пользователя и пароль в заголовок X-DocuSign-Authentication в формате JSON.

Демо-сервер: demo.docusign.net

Производственный сервер: www.docusign.net API

Версия: v2

POST https://{server}/restapi/{apiVersion}/oauth2/token
Content-Type: application/x-www-form-urlencoded
X-DocuSign-Authentication: {"IntegratorKey":"your_integrator_key","Password":"docusign_account_password","Username":"docusign_account_username"}

grant_type=password&client_id=your_integrator_key&username=docusign_account_username&password=docusign_account_password&scope=api

Если вы создаете пользовательское приложение, которое требует, чтобы пользователь ввел свои учетные данные docusign для генерации токена, эта альтернатива вам не подойдет.

Для тех, кто сталкивается с этой ошибкой, я хотел бы отметить это примечание в документации:

Примечание. Полученный код авторизации действителен только в течение 2 минут. Если между получением кода авторизации и попыткой обменять его на токен доступа проходит более двух минут, операция завершится неудачно.

Я боролся с той же ошибкой, пока не заметил заметку и не ускорил набор текста до 2 минут.

Надеюсь, это поможет кому-то еще.

У кого-нибудь есть идея, что здесь не так. Я получаю BadRequest со следующим

{"error":"invalid_grant","error_description":"unauthorized_client"}
var client = new RestClient(ESIGNURL);
            var request = new RestRequest("/oauth/token");
            request.Method = Method.POST;
            request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
            request.AddHeader("Authorization", "Basic " + Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(integrationkey+ ":" + secret)));

            string body = "grant_type=authorization_code&code=" + code;
            request.Parameters.Clear();
            request.AddParameter("application/x-www-form-urlencoded", body, ParameterType.RequestBody);

            var response = client.Execute(request);

В моем случае проблема была связана с неправильным значением заголовка Content-Type, а именно "application/x-www-form-URIencoded" вместо правильного "application/x-www-form-urlencoded". Обратите внимание, что в моем случае проблема была не в "опечатке", а в чрезмерном доверии к документации DocuSign.

Действительно, неправильный Content-Type, на момент написания, предлагался непосредственно на странице документации, где они описывают рабочий процесс предоставления кода авторизации, см. Изображение ниже для соответствующей части.

Надеемся, что они скоро исправят документацию, но пока будем осторожны, чтобы не слепо копировать и вставлять код из их примеров, не задумываясь, как я это делал изначально.

Для людей, пытающихся использовать токен доступа к коду авторизации DocuSign - 01 от Postman: если вы настроили codeFromUrl в своем почтальоне, используя URL-адрес - https://www.example.com/callback в качестве URI перенаправления, то при его последовательном использовании он дает ошибка инвалид_гранта. Вы можете использовать другой сайт, например webhook.site, который динамически генерирует уникальный URL-адрес. Но вам необходимо всегда регистрировать URL-адрес веб-перехватчика в docusign в разделе «Разрешенные URI перенаправления» каждый раз, когда вы создаете другой URL-адрес webhook.site.

Я только что потратил на это день (в NodeJS). Я добавлю пару вещей к предыдущим ответам. Во-первых, я должен был поставить:

      "Content-Type": "application/x-www-form-urlencoded"

в заголовке. В противном случае он дал мне сообщение:

      {
     "error": "invalid_grant",
     "error_description": "unsupported_grant_type"
}

Во-вторых, кодировка base64:

Я использовал это в NodeJS, и это сработало

      const integration_key = process.env.INTEGRATION_KEY;
const secret_key = process.env.SECRET_KEY;
const authinfo =
     integration_key.toString("utf8") + ":" + secret_key.toString("utf8");
const buff2 = Buffer(authinfo, "utf8").toString("base64");

Если вы используете «base64url», это не сработает, потому что он удаляет == с конца строки. Символ = используется в качестве заполнения и, по-видимому, он необходим. Вы видите аналогичную разницу на этом сайте https://www.base64encode.org/ , когда вы переключаете параметр безопасного кодирования URL. Если у вас нет заполнения в конце строки, закодированной в base64 (или если она вообще неверна), вы получите следующее сообщение:

      {
     "error": "invalid_grant",
     "error_description": "unauthorized_client"
}

Наконец, если вы используете Postman (я использую коллекцию Postman от DocuSign), не забудьте сбросить и сохранить переменную codeFromUrl после ее обновления. В противном случае он не обновляется, и вы получаете сообщение:

      {
    "error": "invalid_grant",
    "error_description": "expired_client_token"
}

Это означает, что срок действия старого кода URL истек, а новый не сохранился.

Я тоже получал эту ошибку. Я понял, что добавляю состояние в конец кода перед его передачей в конечную точку токена oauth.

Этот фрагмент от Docusign объясняет, каковы другие причины появления этой ошибки.

Объяснение недопустимой ошибки

Другие вопросы по тегам