GitHub user hditano created a discussion: Microsoft Graph API - Scopes should
be an empty list or a list of strings Error
### Apache Airflow version
2.10.5
### If "Other Airflow 2 version" selected, which one?
_No response_
### What happened?
While trying to test a small DAG that sends an email and Teams webhook, it
fails to send the email, even though all values (Client ID, Tenant ID, Client
Secret) are correct. I even tested a small Python script to make sure the
values were correct.
Granted User.ReadAll and Mail.Send as per permissions
```
e207a3c9daa2
▶ Log message source details
[2025-03-29, 18:13:42 UTC] {local_task_job_runner.py:123} ▶ Pre task execution
logs
[2025-03-29, 18:13:42 UTC] {base.py:84} INFO - Retrieving connection
'azure_graph_email'
[2025-03-29, 18:13:42 UTC] {msgraph.py:258} INFO - Creating Microsoft Graph SDK
client v1.0 for conn_id: azure_graph_email
[2025-03-29, 18:13:42 UTC] {msgraph.py:263} INFO - Host:
https://graph.microsoft.com/
[2025-03-29, 18:13:42 UTC] {msgraph.py:264} INFO - Base URL:
https://graph.microsoft.com/v1.0
[2025-03-29, 18:13:42 UTC] {msgraph.py:265} INFO - Tenant id: xxxxxxxxxxxxxx
[2025-03-29, 18:13:42 UTC] {msgraph.py:266} INFO - Client id:
xxxxxxxxxxxxxxxxxxx
[2025-03-29, 18:13:42 UTC] {msgraph.py:267} INFO - Client secret: ***
[2025-03-29, 18:13:42 UTC] {msgraph.py:268} INFO - API version: v1.0
[2025-03-29, 18:13:42 UTC] {msgraph.py:269} INFO - Scope:
['https://graph.microsoft.com/.default']
[2025-03-29, 18:13:42 UTC] {msgraph.py:270} INFO - Verify: True
[2025-03-29, 18:13:42 UTC] {msgraph.py:271} INFO - Timeout: None
[2025-03-29, 18:13:42 UTC] {msgraph.py:272} INFO - Trust env: True
[2025-03-29, 18:13:42 UTC] {msgraph.py:273} INFO - Authority:
https://login.microsoftonline.com/xxxxxxxxxxxxxxxxxxx
[2025-03-29, 18:13:42 UTC] {msgraph.py:274} INFO - Disable instance discovery:
False
[2025-03-29, 18:13:42 UTC] {msgraph.py:275} INFO - Allowed hosts:
['https://login.microsoftonline.com/xxxxxxxxxxxxxxxxx']
[2025-03-29, 18:13:42 UTC] {msgraph.py:276} INFO - Proxies: {}
[2025-03-29, 18:13:42 UTC] {msgraph.py:277} INFO - MSAL Proxies: {}
[2025-03-29, 18:13:42 UTC] {msgraph.py:278} INFO - HTTPX Proxies: {}
[2025-03-29, 18:13:42 UTC] {taskinstance.py:341} ▼ Post task execution logs
[2025-03-29, 18:13:42 UTC] {standard_task_runner.py:124} ERROR - Failed to
execute job 63 for task send_email (Scopes should be an empty list or a list of
strings; 107)
Traceback (most recent call last):
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/models/taskinstance.py",
line 274, in _run_raw_task
TaskInstance._execute_task_with_callbacks(
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/models/taskinstance.py",
line 3161, in _execute_task_with_callbacks
result = self._execute_task(context, task_orig)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/models/taskinstance.py",
line 3185, in _execute_task
return _execute_task(self, context, task_orig)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/models/taskinstance.py",
line 768, in _execute_task
result = _execute_callable(context=context, **execute_callable_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/models/taskinstance.py",
line 734, in _execute_callable
return ExecutionCallableRunner(
^^^^^^^^^^^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/utils/operator_helpers.py",
line 252, in run
return self.func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/models/baseoperator.py",
line 424, in wrapper
return func(self, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/providers/microsoft/azure/operators/msgraph.py",
line 140, in execute
self.defer(
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/models/baseoperator.py",
line 1800, in defer
raise TaskDeferred(trigger=trigger, method_name=method_name, kwargs=kwargs,
timeout=timeout)
airflow.exceptions.TaskDeferred
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/task/task_runner/standard_task_runner.py",
line 117, in _start_by_fork
ret = args.func(args, dag=self.dag)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/cli/cli_config.py",
line 49, in command
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/utils/cli.py", line
116, in wrapper
return f(*args, **kwargs)
^^^^^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/cli/commands/task_command.py",
line 483, in task_run
task_return_code = _run_task_by_selected_method(args, _dag, ti)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/cli/commands/task_command.py",
line 256, in _run_task_by_selected_method
return _run_raw_task(args, ti)
^^^^^^^^^^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/cli/commands/task_command.py",
line 341, in _run_raw_task
return ti._run_raw_task(
^^^^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/utils/session.py",
line 97, in wrapper
return func(*args, session=session, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/models/taskinstance.py",
line 3006, in _run_raw_task
return _run_raw_task(
^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/models/taskinstance.py",
line 288, in _run_raw_task
ti.defer_task(exception=defer, session=session)
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/utils/session.py",
line 94, in wrapper
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/models/taskinstance.py",
line 3194, in defer_task
_defer_task(ti=self, exception=exception, session=session)
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/api_internal/internal_api_call.py",
line 166, in wrapper
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/utils/session.py",
line 94, in wrapper
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/models/taskinstance.py",
line 1677, in _defer_task
trigger_row = Trigger.from_object(exception.trigger)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/api_internal/internal_api_call.py",
line 166, in wrapper
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/utils/session.py",
line 97, in wrapper
return func(*args, session=session, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/models/trigger.py",
line 143, in from_object
classpath, kwargs = trigger.serialize()
^^^^^^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/providers/microsoft/azure/triggers/msgraph.py",
line 160, in serialize
"api_version": self.api_version,
^^^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/providers/microsoft/azure/triggers/msgraph.py",
line 190, in api_version
return self.hook.api_version
^^^^^^^^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/providers/microsoft/azure/hooks/msgraph.py",
line 180, in api_version
self.get_conn() # Make sure config has been loaded through get_conn to
have correct api version!
^^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/airflow/providers/microsoft/azure/hooks/msgraph.py",
line 298, in get_conn
auth_provider = AzureIdentityAuthenticationProvider(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File
"/home/airflow/.local/lib/python3.12/site-packages/kiota_authentication_azure/azure_identity_authentication_provider.py",
line 34, in __init__
AzureIdentityAccessTokenProvider(
File
"/home/airflow/.local/lib/python3.12/site-packages/kiota_authentication_azure/azure_identity_access_token_provider.py",
line 42, in __init__
raise TypeError(f"Scopes {list_error}")
TypeError: Scopes should be an empty list or a list of strings
[2025-03-29, 18:13:42 UTC] {local_task_job_runner.py:266} INFO - Task exited
with return code 1
[2025-03-29, 18:13:42 UTC] {taskinstance.py:3901} INFO - 0 downstream tasks
scheduled from follow-on schedule check
[2025-03-29, 18:13:42 UTC] {local_task_job_runner.py:245} ▲▲▲ Log group end
```
<img width="876" alt="Image"
src="https://github.com/user-attachments/assets/37f5690a-8338-4c91-afb3-02b46b3145aa"
/>
### What you think should happen instead?
_No response_
### How to reproduce
Just run the DAG as usual and it will fail to send the email / connect to Graph
API every single time.
### Operating System
Ubuntu 22.04 LTS
### Versions of Apache Airflow Providers
_No response_
### Deployment
Docker-Compose
### Deployment details
_No response_
### Anything else?
_No response_
### Are you willing to submit PR?
- [x] Yes I am willing to submit a PR!
### Code of Conduct
- [x] I agree to follow this project's [Code of
Conduct](https://github.com/apache/airflow/blob/main/CODE_OF_CONDUCT.md)
GitHub link: https://github.com/apache/airflow/discussions/64624
----
This is an automatically sent email for [email protected].
To unsubscribe, please send an email to: [email protected]