Я использовал Python для получения токена доступа для Dynamics 365 Marketing. Это код, который работал у меня до перехода на новую политику нашей компании, позволяющую включить MFA в учетной записи Microsoft, поэтому нам нужно подтвердить вход с нашего устройства и ввести номер для подтверждения входа с нашего телефона.
import adal
auth_context = adal.AuthenticationContext("https://login.microsoftonline.com/common")
token_response = auth_context.acquire_token_with_username_password(https://xxxx.xxx.dynamics.com/", username, password, client_id)
Access_Token = token_response["accessToken"]
Однако, когда я запускаю это сейчас, я получаю сообщение об ошибке "AADSTS50076: Due to a configuration change made by your administrator, or because you moved to a new location, you must use multi-factor authentication to access". Кроме того, у меня нет прав администратора, чтобы что-либо менять на портале Azure, и у меня нет секрета клиента, и нет возможности получить его от ИТ-команды, поскольку они его не предоставляют. Как я могу получить токен доступа в этом сценарии без секрета клиента?






Как упоминалось в этом MS Document,
Если пользователям необходимо использовать многофакторную аутентификацию (MFA) для входа в приложение, вместо этого они будут заблокированы при создании токена с потоком паролей имени пользователя.
Изначально. Я тоже получил ту же ошибку, когда пытался сгенерировать токен, используя поток паролей имени пользователя для пользователя, у которого включен MFA:
import adal
auth_context = adal.AuthenticationContext("https://login.microsoftonline.com/common")
username = "[email protected]"
password = "xxxxxxxx"
client_id = "appId"
try:
token_response = auth_context.acquire_token_with_username_password("https://xxxxx.xxxxx.crm.dynamics.com/", username, password, client_id)
access_token = token_response["accessToken"]
print("Access token acquired successfully:", access_token)
except adal.AdalError as e:
print(e.error_response)
Ответ:
Чтобы устранить ошибку, вам необходимо переключиться либо на интерактивный поток, либо на поток кода устройства, который предполагает, что пользователь хотя бы один раз войдет в систему для завершения MFA.
Чтобы использовать интерактивный процесс для получения токена, вам необходимо добавить URI перенаправления как http://localhost на платформе приложений для мобильных и настольных компьютеров. Поскольку у вас нет доступа к изменению чего-либо на портале, вы можете использовать поток кода устройства.
Вы можете использовать приведенный ниже пример кода Python для получения токена с потоком кода устройства:
import adal
authority_url = "https://login.microsoftonline.com/common"
client_id = "appId"
auth_context = adal.AuthenticationContext(authority_url)
# Initiate device code flow
device_code = auth_context.acquire_user_code("https://xxxx.xxxxx.xxx.dynamics.com/", client_id)
print(device_code['message'])
# Poll for token using device code
token_response = auth_context.acquire_token_with_device_code("https://xxxx.xxxxx.xxx.dynamics.com/", device_code, client_id)
access_token = token_response["accessToken"]
print("Access token acquired successfully:", access_token)
Когда вы запустите пример кода, он отобразит одно сообщение со ссылкой и кодом устройства, например:
При нажатии на ссылку открывается браузер и предлагается ввести код устройства, как показано ниже:
На шаге Next вам будет предложено войти в систему с учетной записью Azure, что включает в себя следующее приглашение MFA:
После успешной аутентификации отобразится экран ниже:
Когда вы сейчас проверите консоль вывода, токен доступа будет успешно сгенерирован следующим образом:
Хотите прочитать элементы списка с сайта SharePoint? Вам необходимо сгенерировать токен, изменив область действия на https://yourtenant.sharepoint.com/.default или https://graph.microsoft.com/.default и соответствующим образом предоставить разрешения API.
Пожалуйста, опубликуйте новый вопрос с более подробной информацией об этом требовании и поделитесь ссылкой на вопрос здесь.
Вот ссылка на вопрос, аналогичный моей проблеме - stackoverflow.com/questions/78458417/…
@ samronaldo309 Пожалуйста, проверьте добавленный ответ и дайте мне знать, сработал ли он после включения настройки потока общедоступного клиента :)
Большое спасибо за этот код. Меня устраивает. Я могу получить токен доступа. Кроме того, будет ли это работать для подключения к SharePoint? Что мне нужно изменить, чтобы читать из списка SharePoint?