Skip to content

Api server login broken when using FabAuthManager on 3.0.0rc2 #49229

@dheerajturaga

Description

@dheerajturaga

Apache Airflow version

3.0.0

If "Other Airflow 2 version" selected, which one?

No response

What happened?

Relates to: #49013

When using AIRFLOW__CORE__AUTH_MANAGER: airflow.providers.fab.auth_manager.fab_auth_manager.FabAuthManager in a default setup (undefined api.base_url) api server errors out with

airflow-apiserver-1  | INFO:     172.18.0.1:57946 - "POST /auth/login/ HTTP/1.1" 302 Found
airflow-apiserver-1  | [2025-04-14T13:03:03.312+0000] {configuration.py:1068} WARNING - section/key [api/base_url] not found in config
airflow-apiserver-1  | [2025-04-14T13:03:03.312+0000] {app.py:1744} ERROR - Exception on / [GET]
airflow-apiserver-1  | Traceback (most recent call last):
airflow-apiserver-1  |   File "/home/airflow/.local/lib/python3.12/site-packages/flask/app.py", line 2529, in wsgi_app
airflow-apiserver-1  |     response = self.full_dispatch_request()
airflow-apiserver-1  |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
airflow-apiserver-1  |   File "/home/airflow/.local/lib/python3.12/site-packages/flask/app.py", line 1825, in full_dispatch_request
airflow-apiserver-1  |     rv = self.handle_user_exception(e)
airflow-apiserver-1  |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
airflow-apiserver-1  |   File "/home/airflow/.local/lib/python3.12/site-packages/flask/app.py", line 1823, in full_dispatch_request
airflow-apiserver-1  |     rv = self.dispatch_request()
airflow-apiserver-1  |          ^^^^^^^^^^^^^^^^^^^^^^^
airflow-apiserver-1  |   File "/home/airflow/.local/lib/python3.12/site-packages/flask/app.py", line 1799, in dispatch_request
airflow-apiserver-1  |     return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
airflow-apiserver-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
airflow-apiserver-1  |   File "/home/airflow/.local/lib/python3.12/site-packages/airflow/providers/fab/www/views.py", line 71, in index
airflow-apiserver-1  |     response = make_response(redirect(f"{conf.get('api', 'base_url')}", code=302))
airflow-apiserver-1  |                                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^
airflow-apiserver-1  |   File "/home/airflow/.local/lib/python3.12/site-packages/airflow/configuration.py", line 1070, in get
airflow-apiserver-1  |     raise AirflowConfigException(f"section/key [{section}/{key}] not found in config")
airflow-apiserver-1  | airflow.exceptions.AirflowConfigException: section/key [api/base_url] not found in config
airflow-apiserver-1  | INFO:     172.18.0.1:57946 - "GET /auth/ HTTP/1.1" 500 Internal Server Error

What you think should happen instead?

conf.get('api', 'base_url') should include fallback conf.get('api', 'base_url', fallback="/")
However, I tried this and it still hits the issue. I also tried changing this to str(request.base_url) however, that results in an infinite redirect to <base_url>/auth

How to reproduce

Here's a stripped down docker-compose to reproduce the issue. Just login on the webserver

---
x-airflow-common:
  &airflow-common
  # In order to add custom dependencies or upgrade provider distributions you can use your extended image.
  # Comment the image line, place your Dockerfile in the directory where you placed the docker-compose.yaml
  # and uncomment the "build" line below, Then run `docker-compose build` to build the images.
  image: apache/airflow:3.0.0rc2
  # build: .
  environment:
    &airflow-common-env
    AIRFLOW__CORE__EXECUTOR: LocalExecutor
    AIRFLOW__CORE__AUTH_MANAGER: airflow.providers.fab.auth_manager.fab_auth_manager.FabAuthManager
    AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow
    AIRFLOW__CELERY__RESULT_BACKEND: db+postgresql://airflow:airflow@postgres/airflow
    AIRFLOW__CELERY__BROKER_URL: redis://:@redis:6379/0
    AIRFLOW__CORE__FERNET_KEY: ''
    AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION: 'true'
    AIRFLOW__CORE__LOAD_EXAMPLES: 'false'
    AIRFLOW__CORE__EXECUTION_API_SERVER_URL: 'http://airflow-apiserver:8080/execution/'
    # yamllint disable rule:line-length
    # Use simple http server on scheduler for health checks
    # See https://airflow.apache.org/docs/apache-airflow/stable/administration-and-deployment/logging-monitoring/check-health.html#scheduler-health-check-server
    # yamllint enable rule:line-length
    AIRFLOW__SCHEDULER__ENABLE_HEALTH_CHECK: 'true'
    # WARNING: Use _PIP_ADDITIONAL_REQUIREMENTS option ONLY for a quick checks
    # for other purpose (development, test and especially production usage) build/extend Airflow image.
    _PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:-}
    # The following line can be used to set a custom config file, stored in the local config folder
    # If you want to use it, outcomment it and replace airflow.cfg with the name of your config file
    # AIRFLOW_CONFIG: '/opt/airflow/config/airflow.cfg'
  depends_on:
    &airflow-common-depends-on
    postgres:
      condition: service_healthy

services:
  postgres:
    image: postgres:13
    environment:
      POSTGRES_USER: airflow
      POSTGRES_PASSWORD: airflow
      POSTGRES_DB: airflow
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "airflow"]
      interval: 10s
      retries: 5
      start_period: 5s
    restart: always

  airflow-apiserver:
    <<: *airflow-common
    command: api-server
    ports:
      - "8080:8080"
    healthcheck:
      test: ["CMD", "curl", "--fail", "http://localhost:8080/api/v2/version"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 30s
    restart: always
    depends_on:
      <<: *airflow-common-depends-on
      airflow-init:
        condition: service_completed_successfully
    user: "0:0"

  airflow-init:
    <<: *airflow-common
    entrypoint: /bin/bash
    # yamllint disable rule:line-length
    command:
      - -c
      - |
        mkdir -p /sources/logs /sources/dags /sources/plugins
        exec /entrypoint airflow version
    # yamllint enable rule:line-length
    environment:
      <<: *airflow-common-env
      _AIRFLOW_DB_MIGRATE: 'true'
      _AIRFLOW_WWW_USER_CREATE: 'true'
      _AIRFLOW_WWW_USER_USERNAME: ${_AIRFLOW_WWW_USER_USERNAME:-airflow}
      _AIRFLOW_WWW_USER_PASSWORD: ${_AIRFLOW_WWW_USER_PASSWORD:-airflow}
      _PIP_ADDITIONAL_REQUIREMENTS: ''
    user: "0:0"

volumes:
  postgres-db-volume:

You may also need to add a dummy user with:

airflow users create -u airflow_user -p airflow_user --email airflow_admin@company.com --role Admin -f Airflow -l Admin

Operating System

Ubuntu 24.04 (WSL)

Versions of Apache Airflow Providers

No response

Deployment

Docker-Compose

Deployment details

No response

Anything else?

No response

Are you willing to submit PR?

  • Yes I am willing to submit a PR!

Code of Conduct

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions