Python Adal - невозможно использовать токен доступа для получения сообщений Outlook

Недавно я пытался перенести процесс извлечения электронной почты из Powershell в Python, используя активный каталог Azure для библиотеки Python. Я пытался использовать для этого функцию accept_token_with_client_credentials, но у меня возникла загвоздка.

Я могу использовать приведенный ниже код для возврата кода доступа, но я не могу использовать полученный токен для возврата каких-либо элементов почтового ящика.

Мне удалось создать собственное приложение и успешно получить доступ к сообщениям с помощью accept_token_with_username_password, но не могу заставить этот набор кода работать на моем удаленном рабочем столе, поскольку он печатает сообщение об ошибке чтения :

«Из-за изменения конфигурации, внесенного вашим администратором, или из-за того, что вы переехали в новое место, вы должны использовать многофакторную аутентификацию»

У меня был готов поток учетных данных клиента, но я все еще не могу заставить работать приведенный ниже пример. Может ли кто-нибудь увидеть, где я ошибаюсь?

def test8():

import adal
import requests

authority_url = "https://login.microsoftonline.com/"+lf_tenantid
context = adal.AuthenticationContext(
    authority_url,
    validate_authority=True,
    api_version=None
)

resource = 'https://outlook.office.com/'

token = context.acquire_token_with_client_credentials(
    resource=resource,
    client_id = etl_clientid2,
    client_secret = etl_clientsecret2
)

access_token = token['accessToken']

print(token)
#######################################NONE OF THIS PART WORKS
#######################################
#######################################

folder_id = etl_folderid
url = "https://outlook.office.com/api/v2.0/me/MailFolders/"+folder_id+"/messages"

headers = {
    'Authorization': 'Bearer '+access_token
}

r = requests.get(url, headers=headers)
print(r)

person SoapyDonuts    schedule 03.03.2019    source источник


Ответы (2)


Для всех, кому интересно, это код, который я использовал для решения моей проблемы с токеном доступа:

def save_windows_refreshtoken(app_name, client_id, client_secret):

#import adal
#import requests
import json
import pandas as pd


# OAuth endpoints given in Outlook API documentation
authorization_base_url = 'https://login.microsoftonline.com/common/oauth2/authorize'
token_url = 'https://login.microsoftonline.com/common/oauth2/token' #provides a refresh and access token

redirect_uri = "http://localhost:8000"

from requests_oauthlib import OAuth2Session
outlook = OAuth2Session(client_id,redirect_uri=redirect_uri)

# Redirect  the user owner to the OAuth provider (i.e. Outlook) using an URL with a few key OAuth parameters.
authorization_url, state = outlook.authorization_url(authorization_base_url)
print('Please go here and authorize,', authorization_url)

#The above redirects you to a localhost page (which is blank) but returns a string containing a code which can be used below
#rememebr the search for "&" because there's a couple of bits of data after the code that need to be deleted from the code string before it can be used

# Get the authorization verifier code from the callback url
redirect_response = input('Paste the full redirect URL here:')

# Fetch the access token
token = outlook.fetch_token(token_url,client_secret=client_secret,code=redirect_response)


#convert the returned token json into a dataframe
j_dump = json.dumps(token, sort_keys=True,indent=4, separators=(',', ': ')) #pull out the value data from the json file, messages are stored in value

df = pd.read_json(j_dump) #read the json file into a dataframe

first_row = df.iloc[0] #pull the first row so we can format a new table from it

d = {
    'app_name' : pd.Series([app_name]),
    'refresh_token' : pd.Series([first_row.refresh_token])
    }
data = pd.DataFrame(d)
person SoapyDonuts    schedule 28.03.2019

Вы получаете сообщения с помощью accept_token_with_username_password (), потому что вы получаете токен для данного ресурса через учетные данные пользователя.

Поскольку поток учетных данных клиента используется для обратного канала (связь между сервером), пользователь не участвует в этом, и вы получаете токен субъекта-службы.

Я бы предложил использовать от имени потока или потока кода авторизации (accept_token_with_authorization_code), чтобы получить токен для данного ресурса через код авторизации для серверного приложения и вызвать api Outlook для чтения сообщений.

Ниже приведена ссылка (Outlook Mail API и Python):

https://github.com/jasonjoh/python_tutorial/tree/outlook-api

Библиотека Python adal поддерживает другие методы аутентификации. Ниже приведена ссылка на документацию: https://adal-python.readthedocs.io/en/latest/

Мы предлагаем, чтобы службы Office 365, такие как OneNote, Outlook, Excel, OneDrive, Microsoft Teams, Planner и SharePoint, теперь были доступны в Microsoft Graph.

https://docs.microsoft.com/en-us/previous-versions/office/office-365-api/

person MohitDhingra-MSFT    schedule 19.03.2019
comment
Привет, Мохит, спасибо за сообщение. Да, изучив это, я понял, что мне потребуются дополнительные разрешения от наших администраторов, чтобы использовать поток учетных данных клиента, поэтому решил использовать библиотеку request_oauthlib для запроса токена через мое имя пользователя и пароль Microsoft. Я выложу свой сценарий ниже - person SoapyDonuts; 28.03.2019