Airflow - Как использовать авторизацию безопасности REST API - PullRequest
1 голос
/ 18 марта 2020

Введение:

Привет всем, я пытаюсь использовать REST API Airflow для активации DAG с помощью внешнего триггера, например:

POST: http://{{url}}:{{port}}/api/experimental/dags/MY_DAG_ID/dag_runs

headers = {
        'Content-Type': 'application/json',
        'Cache-Control': 'no-cache',
    }

Проблема:

Это работает очень хорошо (Ответ: Состояние 200) , но мне нужна некоторая безопасность, потому что ее нельзя открыть для публикации c, поэтому я читаю на Аутентификации API, что я могу установить auth_backend на airflow.cfg, который будет работать очень похоже на Аутентификацию по паролю, используемую для веб-интерфейса.


[api]
auth_backend = airflow.contrib.auth.backends.password_auth 

Но теперь ответом является (401 - Несанкционировано) , и я не знаю, как настроить REST API для использования моего внешнего триггера с этой безопасностью.

  • Нужно ли передавать мой пользователь и пароль в заголовке для работы?
  • Как я могу это сделать?

  • Предположим, что существует пользователь: admin , pass: admin и разрешение: Admin


Ссылки:

1 Ответ

0 голосов
/ 18 марта 2020

Вы должны передать заголовок авторизации с зашифрованным заголовком 64 со строкой user: pass

Вы можете проверить, как это происходит здесь: https://github.com/apache/airflow/blob/029c84e5527b6db6bdbdbe026f455da325bedef3/airflow/contrib/auth/backends/password_auth.py#L205

    header = request.headers.get("Authorization")
    if header:
        userpass = ''.join(header.split()[1:])
        username, password = base64.b64decode(userpass).decode("utf-8").split(":", 1)

Пример использования:

https://github.com/apache/airflow/blob/7cba83333c5227ce37967c65d189a5e994898c68/tests/www/api/experimental/test_password_endpoints.py

        response = c.post(
            url_template.format('example_bash_operator'),
            data=json.dumps(dict(run_id='my_run' + datetime.now().isoformat())),
            content_type="application/json",
            headers={'Authorization': 'Basic aGVsbG86d29ybGQ='}  # hello:world
        )
...