mogilevskiikonstantin-commits opened a new issue, #67027:
URL: https://github.com/apache/airflow/issues/67027

   ### Under which category would you file this issue?
   
   Providers
   
   ### Apache Airflow version
   
   3.3.0
   
   ### What happened and how to reproduce it?
   
   ### Description
   
   While testing the new Airflow 3.0 dev-snapshot (Breeze environment) with 
`KeycloakAuthManager` enabled, the FastAPI backend throws persistent `403 
Forbidden` errors on legacy API data endpoints (such as `/api/v1/dags`, 
`/api/v1/plugins`, `/api/v1/importErrors`). 
   
   Crucially, the new web UI configuration endpoints (`/ui/config` and 
`/ui/me`) return `200 OK` and successfully decode the user profile. However, 
the data endpoints fail to evaluate the global `SuperAdmin` permissions, 
locking the UI dashboard behind a red 403 error alert.
   
   ### To Reproduce
   
   I followed the official setup instructions provided in the provider docs, 
adjusted for the Airflow 3.0 architecture.
   
   1. Spin up Airflow and Keycloak by running this command from the root of the 
cloned airflow repo:
   ```bash
   breeze start-airflow --backend postgres --integration keycloak 
--load-example-dags --load-default-connections
   ```
   
   2. Under files/airflow-breeze-config/init.sh specify the following 
configuration (including correct claim path mappings for Keycloak's standard 
token structure):
   
   ```bash
   export AIRFLOW__API__BASE_URL='http://localhost:28080'
   export 
AIRFLOW__CORE__AUTH_MANAGER='airflow.providers.keycloak.auth_manager.keycloak_auth_manager.KeycloakAuthManager'
   export AIRFLOW__KEYCLOAK_AUTH_MANAGER__CLIENT_ID='airflow'
   export 
AIRFLOW__KEYCLOAK_AUTH_MANAGER__CLIENT_SECRET='keycloak-secret-for-client-id'
   export AIRFLOW__KEYCLOAK_AUTH_MANAGER__REALM='airflow'
   
   # Explicitly map the token structure and role names
   export AIRFLOW__KEYCLOAK_AUTH_MANAGER__IS_ADMIN_ROLE_NAME='SuperAdmin'
   export AIRFLOW__KEYCLOAK_AUTH_MANAGER__SUPERADMIN_ROLE_NAME='SuperAdmin'
   export 
AIRFLOW__KEYCLOAK_AUTH_MANAGER__ROLES_CLAIM_NAME='resource_access.airflow.roles'
   export AIRFLOW__CORE__MULTI_TEAM='false'
   ```
   
   3. Access Keycloak via http://localhost:48080 and configure the client:
   
   - Create the airflow realm.
   
   - Create an airflow client with Root URL http://localhost:28080/, Home URL 
/, Valid Redirect URL http://localhost:28080/*, Web Origins and Admin URL as 
http://localhost:28080/.
   
   - Under the Roles section of the airflow client, create two roles: Admin and 
SuperAdmin.
   
   - Create a user in the airflow realm called superadmin and assign the client 
roles specified above.
   
   - Ensure Client Scope mappers for User Client Role are configured to pass 
client roles into both Access and ID tokens.
   
   4. Using the shell in the breeze TUI, run the CLI command to provision 
resources, scopes, and permissions into Keycloak:
   
   ```bash
   airflow keycloak-auth-manager create-all --username admin --password admin
   ```
   
   5. Access Airflow via http://localhost:28080. It redirects to the Keycloak 
sign-in page. Inputting the superadmin credentials redirects back to Airflow, 
where the UI loads but throws multiple 403 errors on the network tab for data 
endpoints.
   
   Token Inspection Details
   Evaluating the Access Token returned from Keycloak shows that the claims 
match the Airflow config perfectly (roles are present under 
resource_access.airflow.roles):
   
   ```
   {
     "exp": 1778914911,
     "iat": 1778914611,
     "jti": "74544747-ee9b-4c3f-839b-504f815e58a6",
     "iss": "http://localhost:48080/realms/airflow";,
     "aud": "account",
     "sub": "ea4fe63d-6546-4b3e-9f8b-5ca9aac8dbba",
     "typ": "Bearer",
     "azp": "airflow",
     "session_state": "ed73b208-07aa-45de-81af-238fc4a850bd",
     "acr": "1",
     "allowed-origins": [
       "http://localhost:28080/";
     ],
     "realm_access": {
       "roles": [
         "default-roles-airflow",
         "offline_access",
         "uma_authorization"
       ]
     },
     "resource_access": {
       "airflow": {
         "roles": [
           "Admin",
           "SuperAdmin"
         ]
       },
       "account": {
         "roles": [
           "manage-account",
           "manage-account-links",
           "view-profile"
         ]
       }
     },
     "scope": "openid profile email",
     "sid": "ed73b208-07aa-45de-81af-238fc4a850bd",
     "email_verified": true,
     "preferred_username": "superadmin"
   }
   ```
   
   ID token structure
   
   ```
   {
     "exp": 1778914911,
     "iat": 1778914611,
     "auth_time": 0,
     "jti": "a5d505ab-130b-4f68-9dce-875186138587",
     "iss": "http://localhost:48080/realms/airflow";,
     "aud": "airflow",
     "sub": "ea4fe63d-6546-4b3e-9f8b-5ca9aac8dbba",
     "typ": "ID",
     "azp": "airflow",
     "session_state": "fecdf990-abd2-4f9c-841a-489c0fd9f8dd",
     "acr": "1",
     "sid": "fecdf990-abd2-4f9c-841a-489c0fd9f8dd",
     "email_verified": true,
     "preferred_username": "superadmin"
   }
   ```
   
   ### What you think should happen instead?
   
   The KeycloakAuthManager should recognize the SuperAdmin role from the token 
claim path and evaluate the is_authorized_dag hooks as True for legacy API data 
wrappers, matching the successful 200 responses of the /ui/config endpoints.
   
   ### Operating System
   
   macOS
   
   ### Deployment
   
   Other
   
   ### Apache Airflow Provider(s)
   
   keycloak
   
   ### Versions of Apache Airflow Providers
   
   apache-airflow-providers-keycloak 0.7.1
   apache-airflow 3.3.0
   
   ### Official Helm Chart version
   
   Not Applicable
   
   ### Kubernetes Version
   
   _No response_
   
   ### Helm Chart configuration
   
   _No response_
   
   ### Docker Image customizations
   
   _No response_
   
   ### Anything else?
   
   _No response_
   
   ### Are you willing to submit PR?
   
   - [ ] 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)
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to