Подтвердить что ты не робот

Ошибка аутентификации Salesforce

Я пытаюсь использовать OAuth-аутентификацию для получения токена аутентификации Salesforce, поэтому я сослался на вики-документы, но после получения кода авторизации при выполнении запроса Post с 5 обязательными параметрами я получаю следующее исключение

{"error":"invalid_grant","error_description":"authentication failure"} CODE 400
JSON = {"error":"invalid_grant","error_description":"authentication failure"}

что я думаю, плохая просьба.

PostMethod post = new PostMethod("https://login.salesforce.com/services/oauth2/token");
post.addParameter("code",##############);
post.addParameter("grant_type","authorization_code");
post.addParameter("redirect_uri","#################");  
post.addParameter("client_id",this.client_id);
post.addParameter("client_secret",this.client_secret);
httpclient.executeMethod(post);
String responseBody = post.getResponseBodyAsString();
System.out.println(responseBody+" CODE "+post.getStatusCode());

Просьба ответить, если известно исключение?

4b9b3361

Ответ 1

Для тех, кто так же застрял и разочарован, я оставил подробный пост в блоге обо всем процессе (с фотографиями и комментариями!). Нажмите на ссылку, если вы хотите, чтобы:

http://www.calvinfroedge.com/salesforce-how-to-generate-api-credentials/

Вот только текстовый ответ:

Шаг 1:

Завести аккаунт. Вы можете создать (бесплатную) учетную запись разработчика на developer.salesforce.com


Шаг 2:

Проигнорируйте все целевые страницы и начинайте дерьмо. Это бесконечный маркетинговый цикл.


Шаг 3:

Нажмите на ссылку "Настройка"


Шаг 4:

На левой панели инструментов в разделе "Создать" нажмите "Приложения"


Шаг 5:

В разделе "Подключенные приложения" нажмите "Новый"


Шаг 6:

Заполните форму. Важные поля - это те, которые помечены как обязательные, и раздел oauth. Обратите внимание, что вы можете оставить любой URL для вашего обратного вызова (я использовал localhost).


Шаг 7:

Имейте в виду, что Salesforce имеет дрянную доступность.


Шаг 8:

Нажмите продолжить. Наконец, у вас есть ключ client_id (помеченный как "Consumer Key") и client_secret (помеченный как "Consumer Secret").


Шаг 9:

Но ждать! Вы еще не закончили; выберите "Управление", затем "Редактировать политику"

  1. Убедитесь, что IP Relax установлен на Relax IP ограничения,

  2. и убедитесь, что для Разрешенных пользователей установлено значение "Все пользователи могут самостоятельно авторизоваться".

  3. а также убедитесь, что ваш Security> Network Access> Trusted IP Ranges был установлен

OAuth settings

Security > Network Access > Trusted IP Ranges

Если вы беспокоитесь об отключении безопасности, не будьте сейчас, вы просто хотите, чтобы это работало сейчас, чтобы вы могли делать вызовы API. Усильте разрешения, как только у вас все будет работать, по одному, чтобы вы могли выяснить, какие настройки выдают ошибки аутентификации.


Шаг 10:

Празднуйте! Этот вызов curl должен завершиться успешно:

на производстве:

curl -v https://login.salesforce.com/services/oauth2/token \
  -d "grant_type=password" \
  -d "client_id=YOUR_CLIENT_ID_FROM_STEP_8" \
  -d "client_secret=YOUR_CLIENT_SECRET_FROM_STEP_8" \
  -d "[email protected]" -d "[email protected]"

на песочнице или тесте:

curl -v https://test.salesforce.com/services/oauth2/token \
  -d "grant_type=password" \
  -d "client_id=YOUR_CLIENT_ID_FROM_STEP_8" \
  -d "client_secret=YOUR_CLIENT_SECRET_FROM_STEP_8" \
  -d "[email protected]" -d "[email protected]"

Заметки:

  • Вам не следует выполнять авторизацию по паролю, если вы создаете мультитенантное приложение, где пользователям необходимо авторизовать свое собственное приложение. Для этого используйте рабочий процесс Oauth2.

  • Возможно, вам потребуется передать свой маркер безопасности, добавленный к вашему паролю.

Ответ 2

У нас была и эта проблема.

Проверьте настройки Connected App - в разделе Selected OAuth Scopes, вам может потребоваться настроить выбранные разрешения. В нашем приложении в основном используется Chatter, поэтому нам пришлось добавить оба:

  • Доступ к вашему каналу Chatter и управление им (chatter_api)
  • Выполнять запросы от вашего имени в любое время (refresh_token).

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

Кроме того, фактическая ошибка invalid_grant возникает из-за ограничений IP. Убедитесь, что IP-адрес сервера, на котором выполняется код аутентификации OAuth, разрешен. Я обнаружил, что если в среде SFDC установлена ​​настройка ограничения IP Enforce IP restrictions (SetupAdministerManage AppsConnected Apps), то каждый профиль пользователя должен иметь также разрешенные IP-адреса.

Ответ 3

TL: DR

Для токенов OAuth 2 при входе в систему...

История:

  1. Я следил за Salesforce "Настройка OAuth 2.0"
  2. Учетные данные были правильными (много посимвольных проверок)
  3. Когда я звонил в curl https://login.salesforce.com/services/oauth2/token -d "...credentials..." он все равно не curl https://login.salesforce.com/services/oauth2/token -d "...credentials..." с:

    {"error":"invalid_grant","error_description":"authentication failure"}

Решение:

Понял, что существуют разные среды OAuth при чтении " Копания глубже" в OAuth 2.0 в Salesforce (выделение добавлено):

Конечные точки аутентификации OAuth 2.0

Конечные точки OAuth - это URL-адреса, которые вы используете для отправки запросов аутентификации OAuth в Salesforce. Когда ваше приложение отправляет запрос на аутентификацию, убедитесь, что вы используете правильную конечную точку OAuth Salesforce. Основными конечными точками являются:

Вместо login.salesforce.com клиенты также могут использовать домены My Domain, community или test.salesforce.com (песочница) в этих конечных точках.

исправлять

Поскольку я вошел в свою среду с помощью test.salesforce.com переключившись на curl https://test.salesforce.com/services/oauth2/token -d "...credentials..." привело к "Поздравляем! (> ^ _ ^)> Дайте OAuth ответ токена "

Ответ 4

Salesforce требует обновления до TLS 1.1 или выше до 22 июля 2017 года, чтобы привести его в соответствие с лучшими отраслевыми практиками в области безопасности и целостности данных: по адресу help.salesforce.com.

попробуйте добавить этот код:

System.Net.ServicePointManager.SecurityProtocol = 
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

Другой вариант - отредактировать ваш реестр:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

Проверьте эту ссылку для более подробных ответов: Протокол безопасности по умолчанию в .NET 4.5

Ответ 5

Чтобы изменить белый диапазон IP-адресов, выполните следующие действия:

  • Нажмите Setup в верхнем правом углу
  • Выберите Administer > Security Controls > Network Access из левой навигации
  • Нажмите New
  • Добавьте свой диапазон IP-адресов
  • Нажмите Save

Ответ 6

Замените свой пароль Salesforce комбинацией пароля и токена безопасности. Например, если ваш пароль "MyPassword" и ваш маркер безопасности "XXXXXX", вам нужно будет ввести "MyPasswordXXXXXX" в поле пароля.

Если у вас нет токена безопасности, вы можете сбросить его, как показано ниже.

  • Зайдите в Ваше имя → Мои настройки → Личные → Сбросить токен безопасности.

Ответ 7

Вы можете позвонить своему контроллеру APEX с помощью Postman, если вы введете Consumer Key и Consumer Secret в настройках токена доступа - для этого вам не нужен токен безопасности.

Настройте Авторизацию, как на этом скриншоте...

Почтальон OAuth 2.0

И введите свои учетные данные в окне после нажатия кнопки Получить новый маркер доступа...

Получить токен доступа

Затем нажмите кнопку "Запросить токен", чтобы сгенерировать токен, затем нажмите кнопку "Использовать токен", и она заполнит поле "Токен доступа" на вкладке "Авторизация", где вы нажмете кнопку "Получить новый токен доступа".

Ответ 8

Я бился головой о стол, пытаясь заставить это работать. Оказывается, моя проблема заключалась в копировании и вставке, что испортило "характер. Я пошел и набрал вручную" вставил это в командную строку, а затем это сработало.

Ответ 9

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

Наконец я обнаружил, что в меню "Настройка" → "Управление подключенными приложениями" → нажмите "MyAppName" → нажмите "Изменить политики".

В поле "Разрешенные пользователи" должно быть установлено значение "Все пользователи могут самостоятельно авторизоваться".

Ответ 10

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

Повторяя запрос в почтальоне, с запросом POST и следующими параметрами

  1. grant_type
  2. ID клиента
  3. client_secret
  4. имя пользователя
  5. пароль

Это решило проблему для меня.

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

Ответ 11

Я использую salesapce soap api со следующим форматом запроса

<?xml version="1.0" encoding="utf-8" ?>
        <env:Envelope
                xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
                xmlns:urn="urn:partner.soap.sforce.com">
            <env:Header>
                <urn:CallOptions>
                    <urn:client>client_id</urn:client>
                    <urn:defaultNamespace>sf</urn:defaultNamespace>
                </urn:CallOptions>
            </env:Header>
            <env:Body>
                <n1:login xmlns:n1="urn:partner.soap.sforce.com">
                    <n1:username>username</n1:username>
                    <n1:password>password+security_token</n1:password>
                </n1:login>
            </env:Body>
        </env:Envelope>

Я успешно зарегистрировался, но приложение не отображается как моя настройка. Когда я попытался с помощью этого метода, он работал.

curl -v https://login.salesforce.com/services/oauth2/token -d "grant_type = password" -d "client_id = YOUR_CLIENT_ID_FROM_STEP_8" -d "client_secret = YOUR_CLIENT_SECRET_FROM_STEP_8" -d "[email protected]" -d "[email protected]"

Может ли кто-нибудь сказать мне, что я делаю неправильно, или salesforce soap api не поддерживают это?