Я предлагаю вам сделать следующее:
Создайте приложение аутентификации: для каждой защищенной конечной точки это приложение будет отвечать за проверку ключа API.
Конфигурирование 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
- Настройте конечную точку в auth-app , соответствующую конечной точке приложения, которое вы хотите аутентифицировать. Предположим, у вас есть приложение с таким отображением:
apiVersion: ambassador/v1
kind: Mapping
name: myapp-mapping
prefix: /myapp/
service: myapp:8000
Тогда вам нужно иметь конечную точку " / myapp / " в auth-app . Там вы прочтете заголовок API-KEY . Если ключ верен, верните HTTP 200 (ОК). После этого посол отправит исходное сообщение на myapp . Если auth-app вернет какую-либо другую вещь, кроме HTTP 200, посол вернет этот ответ клиенту.
- Обойти аутентификацию в необходимых приложениях. Например, вам может потребоваться приложение для входа в систему, отвечающее за предоставление API-ключа клиентам. Вы можете обойти аутентификацию для этих приложений, используя bypass_auth: true в отображении:
apiVersion: ambassador/v1
kind: Mapping
name: login-mapping
prefix: /login/
service: login-app:8080
bypass_auth: true
Отметьте это , если вы хотите узнать больше об аутентификации в Ambassador
РЕДАКТИРОВАТЬ: Согласно этому ответу это хорошая практика, если вы используете в качестве заголовка Authorization: Bearer {base64-API-KEY}
. В Ambassador заголовок Authorization разрешен по умолчанию, поэтому вам не нужно передавать его в поле allow_request_headers .