Проблема аутентификации MSAL при развертывании функции Azure (Python v1), но работает локально
У меня уже довольно давно развернута функция Azure. Функция написана на Python и использует модель v1. Я читаю данные из базы данных в Azure Synapse, используя субъект-службу. Сегодня до 10 утра по центральному стандартному времени это работало без проблем. Однако по прошествии вышеупомянутого времени я начал видеть в журналах 500 ошибок сервера. Сообщение об ошибке указывает следующее (как будто оно передает пустого пользователя):
Result: Failure Exception: InterfaceError: ('28000', "[28000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Login failed for user ''. (18456) (SQLDriverConnect)") Stack: File "/azure-functions-host/workers/python/3.10/LINUX/X64/azure_functions_worker/dispatcher.py", line 475, in _handle__invocation_request call_result = await self._run_async_func( File "/azure-functions-host/workers/python/3.10/LINUX/X64/azure_functions_worker/dispatcher.py", line 758, in _run_async_func return await ExtensionManager.get_async_invocation_wrapper( File "/azure-functions-host/workers/python/3.10/LINUX/X64/azure_functions_worker/extension.py", line 147, in get_async_invocation_wrapper result = await function(**args) File "/home/site/wwwroot/TestTrigger/__init__.py", line 58, in main sqlRoutesOutput = currentRoutes.synapseSql(); File "/home/site/wwwroot/classes/nexsql.py", line 32, in synapseSql synConn = pyodbc.connect(synConnString, attrs_before = {SQL_COPT_SS_ACCESS_TOKEN:tokenstruct})
А это блок кода:
def synapseSql(self):
creds = ConfidentialClientApplication(
client_id=os.environ['clientid'],
authority=f"https://login.microsoftonline.com/{os.envion['tenantid']}",
client_credential= os.environ['sqlcreds'])
token = creds.acquire_token_for_client(scopes=['https://database.windows.net/.default'])
tokenb = bytes(token["access_token"], "UTF-8")
exptoken = b''
for i in tokenb:
exptoken += bytes({i})
exptoken += bytes(1)
tokenstruct = struct.pack("=i", len(exptoken)) + exptoken
SQL_COPT_SS_ACCESS_TOKEN = 1256
synConnString = 'DRIVER={ODBC Driver 17 for SQL Server};' \
+ f'SERVER={self.server};' \
+ f'DATABASE={self.database};'\
+ 'ENCRYPT=Yes;'
synConn = pyodbc.connect(synConnString, attrs_before = {SQL_COPT_SS_ACCESS_TOKEN:tokenstruct})
cursor = synConn.cursor()
cursor.execute(self.query)
return cursor
Как видите, я использую ConfidentialClientApplication для создания кредитов и получения токена. А затем, используя последующий код, который я нашел здесь для структуры токена.
Пожалуйста, дайте мне знать, если я могу предоставить дополнительную информацию, чтобы помочь.
Спасибо!
Я действительно в растерянности, поскольку это работает локально, и все в моем окружении говорят, что ничего не изменилось. Я трижды проверил разрешение участников службы, срок действия секрета и т. д.