공부/Open Source

[Airflow/helm] Keycloak OAuth 붙이기

haejang 2024. 8. 4. 17:34
728x90
728x90

 

 

 

# 사용 차트

User Community 버전 / 8.8.0

https://artifacthub.io/packages/helm/airflow-helm/airflow/8.8.0

 

airflow 8.8.0 · airflow-helm/airflow-helm

Airflow Helm Chart (User Community) - the standard way to deploy Apache Airflow on Kubernetes with Helm

artifacthub.io

 

 

# 1. Keycloak Client 생성

참고로 난 keycloak 21버전을 사용한다.

>> keycloak 설치 글 : [Keycloak 21] k8s cluster에 helm chart로 설치하기

 

Client > Create client

 

Client Secret이 필요하므로 Client authentication을 활성화시킨다.

 

Valid redirect URIs 에는 `*` 을 추가시켜 주자

 

# 2. open id Client Scope 생성 (realm 단위)

https://www.inflearn.com/community/questions/735104/keycloack-userinfo-403-forbidden-error

 

keycloack userinfo 403 forbidden err... - 인프런 | 커뮤니티 질문&답변

누구나 함께하는 인프런 커뮤니티. 모르면 묻고, 해답을 찾아보세요.

www.inflearn.com

 

애를 많이 먹은 부분. 키클락 최신 버전에서는 openid scope 를 생성해줘야 한다고 한다

 

Client scopes > Create client scope

 

openid 란 이름으로 Default OpenID Connect scope 생성

 

# 3. Airflow helm value 추가

web:
  webserverConfig:
    stringOverride: |
      from flask_appbuilder.security.manager import AUTH_OAUTH
      AUTH_TYPE = AUTH_OAUTH
      AUTH_USER_REGISTRATION = True
      AUTH_USER_REGISTRATION_ROLE = "Admin"
      OAUTH_PROVIDERS = [
          {
            "name": "keycloak",
            "icon": "fa-key",
            "token_key": "access_token",
            "remote_app": {
              "client_id": "<KEYCLOAK_CLIENT_ID>",
              "client_secret": "<KEYCLOAK_CLIENT_SECRET>",
              "api_base_url": "https://<KEYCLOAK_DOMAIN>/realms/<KEYCLOAK_REALM>/protocol/openid-connect",
              "client_kwargs": {
                  "scope": "email profile openid"
              },
              "access_token_url": "https://<KEYCLOAK_DOMAIN>/realms/<KEYCLOAK_REALM>/protocol/openid-connect/token",
              "authorize_url": "https://<KEYCLOAK_DOMAIN>/realms/<KEYCLOAK_REALM>/protocol/openid-connect/auth",
              "request_token_url": None,
              "jwks_uri": "http://<KEYCLOAK_DOMAIN>/realms/<KEYCLOAK_REALM>/protocol/openid-connect/certs",
            },
          },
      ]

      AUTH_ROLES_MAPPING = {}
      AUTH_ROLES_SYNC_AT_LOGIN = True
      PERMANENT_SESSION_LIFETIME = 1800

 

 

`AUTH_ROLES_MAPPING` 을 통해 그룹별 권한 관리도 할 수 있을 것 같은데, 이리저리 시도해봤지만 난 실패했다.

-> 그래서 그냥 모두에게 Admin 줌 (`AUTH_USER_REGISTRATION_ROLE`)

 

 

 

 

 

 

728x90
728x90