Ошибка аутентификации 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());
Просьба ответить, если известно исключение?
Ответы
Ответ 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:
Но ждать! Вы еще не закончили; выберите "Управление", затем "Редактировать политику"
-
Убедитесь, что IP Relax установлен на Relax IP ограничения,
-
и убедитесь, что для Разрешенных пользователей установлено значение "Все пользователи могут самостоятельно авторизоваться".
-
а также убедитесь, что ваш 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 (Setup → Administer → Manage Apps → Connected Apps), то каждый профиль пользователя должен иметь также разрешенные IP-адреса.
Ответ 3
TL: DR
Для токенов OAuth 2 при входе в систему...
История:
- Я следил за Salesforce "Настройка OAuth 2.0"
- Учетные данные были правильными (много посимвольных проверок)
-
Когда я звонил в 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 и следующими параметрами
- grant_type
- ID клиента
- client_secret
- имя пользователя
- пароль
Это решило проблему для меня.
Просто разместите его здесь на случай, если есть другие, которые попробовали все возможные решения безрезультатно (как я сделал).
Ответ 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 не поддерживают это?