PS C:\Users\Nicolas\tutorial-outlook-api-crash-course> & c:/Users/Nicolas/tutorial-outlook-api-crash-course/Scripts/python.exe "c:/Users/Nicolas/tutorial-outlook-api-crash-course/ms_graph ((3 gpt))original - Копировать добавлен main.py"
APPLICATION_ID: скрыт
CLIENT_SECRET: скрыт
Попытка получить доступ токен...
Ошибка: не удалось получить токен доступа: {'error': 'invalid_grant',
'error_description': "AADSTS65001: Пользователь или администратор не дал
согласия на использование приложения со «скрытым» идентификатором под названием «приложение Azure для
api python». Отправьте интерактивный запрос авторизации для этого пользователя
и ресурса. Идентификатор трассировки: скрыт Идентификатор корреляции: скрыт Метка времени:
29.11.2024 02:49:38Z", 'error_codes': [65001], 'метка времени':
'29.11.2024 02: 49:38Z', 'trace_id': 'скрытый', 'correlation_id':
'скрытый', 'suberror': 'consent_required'
Вот полный код
Код: Выделить всё
import os
import webbrowser
import msal
from dotenv import load_dotenv
MS_GRAPH_BASE_URL = 'https://graph.microsoft.com/v1.0'
def get_access_token(application_id, client_secret, scopes):
client = msal.ConfidentialClientApplication(
client_id=application_id,
client_credential=client_secret,
authority='https://login.microsoftonline.com/(hidden-tenantID#usedhere)'
####
)
# Check if there is a refresh token stored
refresh_token = None
if os.path.exists('refresh_token.txt'):
with open('refresh_token.txt', 'r') as file:
refresh_token = file.read().strip()
if refresh_token:
# Try to acquire a new access token using the refresh token
token_response = client.acquire_token_by_refresh_token(refresh_token, scopes=scopes)
else:
# No refresh token, proceed with the authorization code flow
auth_request_url = client.get_authorization_request_url(scopes)
webbrowser.open(auth_request_url)
authorization_code = input('Enter the authorization code: ')
if not authorization_code:
raise ValueError("Authorization code is empty")
token_response = client.acquire_token_by_authorization_code(
code=authorization_code,
scopes=scopes
)
if 'access_token' in token_response:
# Store the refresh token securely
if 'refresh_token' in token_response:
with open('refresh_token.txt', 'w') as file:
file.write(token_response['refresh_token'])
return token_response['access_token']
else:
raise Exception('Failed to acquire access token: ' + str(token_response))
def main():
load_dotenv()
# Check if the environment variables are loaded correctly
APPLICATION_ID = os.getenv('APPLICATION_ID')
CLIENT_SECRET = os.getenv('CLIENT_SECRET')
print(f"APPLICATION_ID: {APPLICATION_ID}") # Debug: Check if environment variable loaded correctly
print(f"CLIENT_SECRET: {CLIENT_SECRET}") # Debug: Check if environment variable loaded correctly
SCOPES = ['User.Read', 'Mail.ReadWrite', 'Mail.Send']
# add print for scopes
try:
print("Attempting to get access token...") # Debug
access_token = get_access_token(application_id=APPLICATION_ID, client_secret=CLIENT_SECRET, scopes=SCOPES)
print(f"Access Token: {access_token}") # Debug to show if token was retrieved
headers = {
'Authorization' : 'Bearer ' + access_token
}
print(f"Headers: {headers}") # Debug to show headers
except Exception as e:
print(f'Error: {e}')
if __name__ == "__main__":
main()
Я попытался переделать все это и первоначальную настройку, которая создает venv Python и регистрацию приложения Azure для переменных секрета клиента и идентификатора приложения в этом venv, используя учетная запись моей мамы (босса) Azure
из учетной записи моей мамы из Azure, что может быть неважно, поскольку я все еще получаю ту же ошибку и не знаком с Azure (и которая потребовала от меня активировать мой p2 подписка, пожалуйста, дайте мне знать, если это необходимо) мы зашли в роли и администраторы> административные блоки и создали административный блок, а также добавили себя в качестве администратора пользователя внутри этого административного блока под созданным пользователем администратора> роли и администраторы> администратор пользователя, я также попытался добавить разрешения API, такие как mail.readwrite и Male.send, но msgraph не указан как доступный вариант, где я смотрел, и оба этих других шага являются всего лишь попытками разрешения и не уверены, что они даже не имеют отношения к моему коду/его ошибка
............................
Подробнее здесь: https://stackoverflow.com/questions/792 ... -problem-u