#salesforce #salesforce-lightning
#система salesforce #salesforce-lightning
Вопрос:
Я настроил подключенное приложение, приложение на Python для программного доступа к объектам Salesforce от имени пользователя (автономный доступ).
Приложение работает, и я могу сгенерировать access_token
:
$ curl https://login.salesforce.com/services/oauth2/token -d "grant_type=password" -d "client_id=MY_APP_CLIENT_ID" -d "client_secret=MY_APP_SECRET" -d "username=my@user.com" -d "password=my_password"
{"access_token":"00D09000000KDIX!AQoAQNi1234","instance_url":"https://my_instance.salesforce.com","id":"https://login.salesforce.com/id/12345/12345","token_type":"Bearer","issued_at":"1606401330889","signature":"abc/def"}
Пока все хорошо.
Теперь я хотел переключиться на поток на основе веб-сервера, который использует токены обновления, но я в тупике. Где я могу получить исходное refresh_token
сообщение для отправки вместе grant_type=refresh_token
? Документы, похоже, предполагают, что у меня уже есть refresh_token
, и я просто хочу создать другой access_token
на основе этого, что не так.
Каковы фактические шаги и необходимые вызовы, сквозные?
Список документов, которые я нашел и прочитал, но не сделал меня мудрее:
- https://help.salesforce.com/articleView?id=remoteaccess_oauth_tokens_scopes.htmamp;type=5
- https://help.salesforce.com/articleView?id=remoteaccess_oauth_refresh_token_flow.htmamp;type=5
- https://developer.salesforce.com/forums/?id=906F0000000AgInIAK
- https://help.salesforce.com/articleView?id=connected_app_create_api_integration.htmamp;type=5
Комментарии:
1. Какой поток OAuth вы пытаетесь реализовать? Похоже, вам, вероятно, нужны потоки веб-сервера или пользовательского агента , но если вы создаете автономное приложение без головы, вам может понадобиться JWT .
2. @DavidReed JWT, в конце концов. Но пока:
Now I wanted to switch to a web-server-based flow that uses refresh tokens
.
Ответ №1:
Вот документация Salesforce по потоку OAuth веб-сервера. Он работает следующим образом; обратите внимание, что требуется взаимодействие с пользователем, поэтому curl
само по себе недостаточно для наглядной демонстрации процесса.
- Вы направляете пользователя в пользовательский интерфейс входа в систему Salesforce в его веб-браузере, чтобы получить код авторизации:
https://login.salesforce.com/services/oauth2/authorize?client_id=<YOUR CONNECTED APP CLIENT ID>amp;redirect_uri=<CALLBACK URL ON YOUR SERVER>amp;response_type=code
- Пользователь взаимодействует со страницей авторизации, чтобы утвердить ваше приложение.
- Затем пользователь перенаправляется на URL обратного вызова в вашем приложении, который вы указали в вызове (примечание: это также должно быть настроено как обратный вызов в определении подключенного приложения), например,
https://YOUR_SERVER.com/oauth2/callback?code=<AUTHORIZATION CODE>
При желании ваше приложение может представить здесь пользовательский интерфейс, но суть в том, чтобы ввести код авторизации.
URL обратного вызова может быть на localhost. Вот как, например, интерфейс командной строки Salesforce реализует авторизацию организаций; он запускает локальный веб-сервер для получения обратного вызова.
- На этом взаимодействие с пользователем завершено. Ваше приложение отправляет
POST
запрос в/services/oauth2/token
конечную точку Salesforce для обмена полученного кода авторизации на токен доступа.Если ваше подключенное приложение настроено с
refresh_token
областью действия, вы также получите обратно токен обновления, который можно сохранить и использовать для получения новых токенов доступа в будущем, используя уже определенный поток токенов обновления.
Для приложения без головы может быть проще сразу перейти к JWT (если это ваша конечная цель). У меня есть пример того, как связать аутентификацию JWT с библиотекой simple_salesforce
Python. Для заполнения сертификата в подключенном приложении и назначения предварительно утвержденных профилей (или, что еще лучше, наборов разрешений) требуется небольшая начальная настройка, но после завершения настройки она выполняется очень плавно и не требует какого-либо взаимодействия с пользователем.
Комментарии:
1. Я рад, что спросил! Потрясающий ответ, включая последний абзац. Спасибо.
2. Работает. Для тех, кому интересно:
instance_url
возвращается в ответе JSON в пункте 4 вместе сrefresh_token
.