Как кэшировать токены ADAL между запусками консольного приложения Python

#python #microsoft-graph-api #adal

#python #microsoft-graph-api #adal

Вопрос:

Прямо сейчас я работаю над проектом, целью которого является ежеминутный вызов определенной конечной точки Microsoft Graph из консольного приложения python на Raspberry Pi (если возвращается определенное значение, то запускаются другие процессы Raspberry Pi). Я смог освоить основы работы на основе кода, доступного в этом репозитории:https://github.com/microsoftgraph/python-sample-console-app

Однако, поскольку я хочу, чтобы это выполнялось каждую минуту или около того (и я надеялся сделать это с помощью crontab или чего-то подобного, а не цикла while в постоянно работающем скрипте), способ написания скрипта в настоящее время требует, чтобы пользователь копировал код аутентификации в веб-браузер и подтверждал свою учетную запись при каждом запуске в соответствии с потоком кода устройства. В идеале я хотел бы выполнить эту проверку подлинности на основе браузера один раз, кэшировать токен и использовать этот токен до тех пор, пока он действителен, или вызвать refresh_token .

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

Текущий код аутентификации показан здесь:

 import base64
import os
import urllib
import webbrowser
import json
from adal import AuthenticationContext
import pyperclip
import requests
import config

def api_endpoint(url):
    if urllib.parse.urlparse(url).scheme in ['http', 'https']:
        return url # url is already complete
    return urllib.parse.urljoin(f'{config.RESOURCE}/{config.API_VERSION}/',
                                url.lstrip('/'))

def device_flow_session(client_id, auto=False):
    ctx = AuthenticationContext(config.AUTHORITY_URL)
    device_code = ctx.acquire_user_code(config.RESOURCE,client_id)

    # display user instructions
    if auto:
        pyperclip.copy(device_code['user_code']) # copy user code to clipboard
        webbrowser.open(device_code['verification_url']) # open browser
        print(f'The code {device_code["user_code"]} has been copied to your clipboard, '
              f'and your web browser is opening {device_code["verification_url"]}. '
              'Paste the code to sign in.')
    else:
        print(device_code['message'])

    token_response = ctx.acquire_token_with_device_code(config.RESOURCE,
                                                        device_code,
                                                        client_id)
    if not token_response.get('accessToken', None):
        return None

    session = requests.Session()
    session.headers.update({'Authorization': f'Bearer {token_response["accessToken"]}',
                            'SdkVersion': 'sample-python-adal',
                            'x-client-SKU': 'sample-python-adal'})
    return session
  

Комментарии:

1. Если вы хотите вызвать токен доступа без входа в систему с пользователем, вы можете попробовать использовать поток учетных данных клиента . Это пример с Python.

2. Начиная с 30 июня 2020 года, мы больше не будем добавлять новые функции в ADAL. Мы продолжим добавлять критические исправления безопасности в ADAL до 30 июня 2022 года. После этой даты ваши приложения, использующие ADAL, продолжат работать, но мы рекомендуем перейти на MSAL, чтобы воспользоваться новейшими функциями. Используя Daemon app, вы можете получить токен для вызова Graph API от своего имени (не от имени пользователя). Он использует стандартный поток учетных данных клиента OAuth 2.0. Python с MSAL с использованием потока учетных данных клиента .

3. Спасибо @Raghavendra-MSFTIdentity — Я по существу отклонил приведенный выше код и переключился на MSAL, и смог выполнить то, что мне нужно, используя SerializableTokenCache, как показано здесь: msal-python.readthedocs.io/en/latest /…

4. Спасибо за подтверждение. Могу ли я перенести это в ответ, чтобы это помогло другим.

Ответ №1:

(Переход от комментариев к ответу)

Начиная с 30 июня 2020 года, мы больше не будем добавлять новые функции в ADAL. Мы продолжим добавлять критические исправления безопасности в ADAL до 30 июня 2022 года. После этой даты ваши приложения, использующие ADAL, продолжат работать, но мы рекомендуем перейти на MSAL, чтобы воспользоваться новейшими функциями. Используя Daemon app, вы можете получить токен для вызова Graph API от своего имени (не от имени пользователя). Он использует стандартный поток учетных данных клиента OAuth 2.0. Python с MSAL с использованием клиентского потока учетных данных.

Пользователь смог решить проблему путем перехода на Msal и смог выполнить это требование с помощью SerializableTokenCache, следуя документу.