В настоящее время я работаю над проектом, в котором мне нужно получить доступ к различным URL-адресам, связанным с Microsoft Forms, из моего бэкэнда Python. Однако при попытке сделать это я сталкиваюсь с ошибкой 403. Вот разбивка того, чего я пытаюсь достичь, и шагов, которые я предпринял на данный момент:
URL-адреса для доступа: Получите все формы для группы Microsoft 365:
https://forms.office.com/formapi/api/{tenantId}/groups/{groupId}/forms
Получите данные для групповой формы:
https://forms.office.com/formapi/api/{tenantId}/groups/{groupId}/forms('{formId}')
Получите вопросы из групповой формы:
https://forms.office.com/formapi/api/{tenantId}/groups/{groupId}/forms('{formId}')/questions
Получить ответы в групповой форме:
https://forms.office.com/formapi/api/{tenantId}/groups/{groupId}/forms('{formId}')/responses
Цель: получить доступ к URL-адресам данных Microsoft Forms из серверной части.
Подход:
Сначала я захожу на сайт MS Forms.
Затем я добавляю необходимые параметры (tenantId и groupId) к URL-адресам, к которым хочу получить доступ, и получаю ответы браузера в формате JSON.
Теперь, используя серверные запросы, я пытаюсь получить доступ к этим URL-адресам, передавая необходимый токен аутентификации.
Проблема. Несмотря на успешное получение токена аутентификации с помощью предоставленного фрагмента кода, когда я попытался получить доступ к URL-адресам Microsoft Forms с помощью сгенерированного токена, я получил ошибку 403.
Вот фрагмент кода, который я использую для получения токена:
token_url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token"
data = {
"grant_type": "client_credentials",
"client_id": client_id,
"client_secret": client_secret,
"scope": "https://forms.office.com/.default"
}
response = requests.post(token_url, data=data)
response.raise_for_status() # Raise an exception for non-200 status codes
Вот фрагмент кода, который я использую для доступа к URL-адресам Microsoft Forms с помощью полученного токена:
headers = {
'Authorization': f'Bearer {response.json()["access_token"]}',
'Content-Type': 'application/json',
}
base_url = "https://forms.office.com/formapi/api/{tenantId}/groups/{groupId}/forms"
list_response = requests.get(url=base_url, headers=headers)
Я не уверен, почему я получаю ошибку 403, несмотря на наличие действующего токена. Я следовал инструкциям, упомянутым в этом посте, но безуспешно.
Любые идеи или помощь в решении этой проблемы будут высоко оценены.
Заранее спасибо!
Первоначально я тоже получил ту же ошибку, когда использовал токен, сгенерированный с потоком учетных данных клиента, для вызова API MS Forms следующим образом:
import requests
tenant_id = "tenantId"
client_id = "appID"
client_secret = "secret"
token_url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token"
data = {
"grant_type": "client_credentials",
"client_id": client_id,
"client_secret": client_secret,
"scope": "https://forms.office.com/.default"
}
response = requests.post(token_url, data=data)
headers = {
'Authorization': f'Bearer {response.json()["access_token"]}',
'Content-Type': 'application/json',
}
base_url = "https://forms.office.com/formapi/api/tenantId/groups/groupId/forms"
list_response = requests.get(url=base_url, headers=headers)
print(list_response)
Ответ:
Чтобы устранить эту ошибку, вам необходимо переключиться на делегированные потоки для создания токена носителя, который требует от пользователя хотя бы одного входа в систему.
В моем случае я выполнил команду CLI для первоначального подключения к учетной записи Azure в терминале следующим образом:
az login --tenant tenantID
Теперь я запустил приведенный ниже пример кода Python, который использует модуль azure-identity
, генерируя токен с помощью метода AzureCliCredential(), и успешно получил данные формы в ответ:
import requests
from azure.identity import DefaultAzureCredential, InteractiveBrowserCredential, AzureCliCredential
# Use one of these credential objects to get an access token
cred = AzureCliCredential() # i.e. `az login`
# cred = InteractiveBrowserCredential()
# cred = DefaultAzureCredential()
# Request an access token with the following scope
scope = "https://forms.office.com/.default"
token = cred.get_token(scope)
tenantId = "tenantId"
groupId = "groupId"
url = f"https://forms.office.com/formapi/api/{tenantId}/groups/{groupId}/forms"
# Provide the access token in the request header
headers = {"Authorization": f"Bearer {token.token}"}
list_response = requests.get(url, headers=headers)
print(list_response.json())
Ответ:
Ссылка:
Как получить доступ к ответам в онлайн-форме MS Form с кодом? - Переполнение стека от 9nut
Как я могу включить этот поток аутентификации в свой проект Python Django?
Не могли бы вы опубликовать новый вопрос, включив в него настройки файлов проекта Python django и пример кода с более подробной информацией? Пожалуйста, поделитесь ссылкой на новый вопрос здесь
Привет, вот ссылка на новый пост stackoverflow.com/questions/78417727/…
AFAIK, аутентификация субъекта-службы не поддерживается для вызова API MS Forms. Вам необходимо использовать делегированные потоки, такие как интерактивный поток, для создания токена на предъявителя. Обратитесь к этому stackoverflow.com/questions/65698985/…