Авторизация ключа API для Амбассадора

Я пытаюсь понять, как создать простой прокси-сервер, защищенный ключом API, с помощью Ambassador на k8s, но, похоже, не могу найти никаких документов по этому поводу.

В частности, я просто хочу настроить его так, чтобы он мог принимать запрос с заголовком API-KEY, аутентифицировать его и, если API-KEY действителен для какого-либо клиента, передавать его на мой сервер.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
1 530
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я предлагаю вам сделать следующее:

  1. Создайте приложение аутентификации: для каждой защищенной конечной точки это приложение будет отвечать за проверку ключа API.

  2. Настройка Ambassador для перенаправления запросов к этой службе: вам просто нужно аннотировать определение службы приложения для проверки подлинности. Пример:

    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: auth-app
      annotations:
        getambassador.io/config: |
          ---
          apiVersion: ambassador/v1
          kind:  AuthService
          name:  authentication
          auth_service: "auth-app:8080"
          allowed_request_headers:
          - "API-KEY"
    spec:
      type: ClusterIP
      selector:
        app: auth-app
      ports:
      - port: 8080
        name: auth-app
        targetPort: auth-app
  1. Настройте конечную точку в приложение авторизации, соответствующую конечной точке приложения, которое вы хотите аутентифицировать. Предположим, у вас есть приложение с таким отображением:
    apiVersion: ambassador/v1
    kind:  Mapping
    name:  myapp-mapping
    prefix: /myapp/
    service: myapp:8000

Затем вам нужно иметь конечную точку "/мое приложение/" в приложение авторизации. Там вы прочтете свой заголовок API-КЛЮЧ. Если ключ действителен, верните HTTP 200 (ОК). Затем представитель отправит исходное сообщение на мое приложение. Если приложение авторизации возвращает что-либо еще, кроме HTTP 200, представитель вернет этот ответ клиенту.

  1. Обход аутентификации в необходимых приложениях. Например, вам может понадобиться приложение для входа в систему, отвечающее за предоставление ключа API клиентам. Вы можете обойти аутентификацию для этих приложений, используя bypass_auth: правда в сопоставлении:
    apiVersion: ambassador/v1
    kind:  Mapping
    name:  login-mapping
    prefix: /login/
    service: login-app:8080
    bypass_auth: true

Проверь это, если вы хотите узнать больше об аутентификации в Ambassador

Обновлено: Согласно этому ответу рекомендуется использовать в качестве заголовка Authorization: Bearer {base64-API-KEY}. В Ambassador заголовок Авторизация разрешен по умолчанию, поэтому вам не нужно передавать его в поле allow_request_headers.

Означает ли это, что Ambassador не выполняет никаких проверок ключей API самостоятельно, и мне всегда придется предоставлять для этого дополнительную услугу?

kozyr 25.04.2019 01:48

В случае версии с открытым исходным кодом — да, единственный метод аутентификации — через внешнюю службу. Моя команда разработчиков также была разочарована этим, но после разработки дополнительной службы мы получили возможность создавать собственные правила и механизмы аутентификации, которые могут быть разными для каждой конечной точки. Согласно странице платной версии Амбассадор Про, эта версия имеет интеграцию с OAuth, проверкой JWT и функцией ключей API, которая появится в ближайшее время. Версия Pro довольно новая, поэтому я предполагаю, что большинство пользователей Ambassador прекрасно справились с внешней аутентификацией.

victortv 25.04.2019 02:01

Я остановился на этом быстром и грязном решении после того, как не нашел простого подхода (который не включал бы запуск внешней службы аутентификации).

Вы можете использовать Маршрутизация на основе заголовков и разрешать входящие запросы только с соответствующим header:value.

---
apiVersion: getambassador.io/v2
kind: Mapping
metadata:
  name: protected-mapping
  namespace: default
spec:
  prefix: /protected-path/
  rewrite: /
  headers:
    # Poorman's Bearer authentication
    # Ambassador will return a 404 error unless the Authorization header value is set as below on the incoming requests.
    Authorization: "Bearer <token>"
  service: app:80

Тестирование

# Not authenticated => 404
$ curl -sI -X GET https://ambassador/protected-path/
HTTP/1.1 404 Not Found
date: Thu, 11 Mar 2021 18:30:27 GMT
server: envoy
content-length: 0

# Authenticated => 200
$ curl -sI -X GET -H 'Authorization: Bearer eEVCV1JtUzBSVUFvQmw4eVRVM25BenJa' https://ambassador/protected-path/
HTTP/1.1 200 OK
content-type: application/json; charset=utf-8
vary: Origin
date: Thu, 11 Mar 2021 18:23:20 GMT
content-length: 15
x-envoy-upstream-service-time: 3
server: envoy

Хотя технически здесь можно использовать любую пару header:value (например, x-my-auth-header: header-value), схема Authorization: Bearer ... выглядит как лучший вариант, если вы хотите следовать стандарту.

Будете ли вы кодировать base64 или нет ваш токен в этом случае, зависит от вас.

Вот подробное объяснение того, как читать и понимать спецификации в этом отношении: https://stackoverflow.com/a/56704746/4550880

Это сводится к следующему формату регулярного выражения для значения токена:

[-a-zA-Z0-9._~+/]+=*

Другие вопросы по теме