<a id="i-basic-auth"></a>

# Базовая HTTP-аутентификация

ANIC поддерживает аутентификацию HTTP-запросов.
Для настройки базовой HTTP-аутентификации используются следующие две аннотации:

- `angie.software/basic-auth-secret: "secret"` — обязательная аннотация,
  указывает на секрет, содержащий список пользователей в формате `htpasswd`.
  Значения хранятся в поле `htpasswd`. Тип секрета: `angie.software/htpasswd`.
- `angie.software/basic-auth-realm: "realm"` — необязательная аннотация,
  определяет область (realm), отображаемую в окне входа.

1. Установите ANIC.
2. Сохраните публичный IP-адрес ANIC в переменной оболочки:
   ```console
   $ IC_IP=<ваш_IP-адрес>
   ```
3. Сохраните HTTP-порт ANIC в переменную оболочки:
   ```console
   $ IC_HTTP_PORT=<номер_порта>
   ```
4. Создайте Deployment и Service приложения Cafe для компонентов `coffee` и `tea`:

   ### Пример

   ```yaml
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: coffee
   spec:
     replicas: 2
     selector:
       matchLabels:
         app: coffee
     template:
       metadata:
         labels:
           app: coffee
       spec:
         containers:
         - name: coffee
           image: angiesoftware/angie-hello:plain-text
           ports:
           - containerPort: 8080
   ---
   apiVersion: v1
   kind: Service
   metadata:
     name: coffee-svc
   spec:
     ports:
     - port: 80
       targetPort: 8080
       protocol: TCP
       name: http
     selector:
       app: coffee
   ---
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: tea
   spec:
     replicas: 3
     selector:
       matchLabels:
         app: tea
     template:
       metadata:
         labels:
           app: tea
       spec:
         containers:
         - name: tea
           image: angiesoftware/angie-hello:plain-text
           ports:
           - containerPort: 8080
   ---
   apiVersion: v1
   kind: Service
   metadata:
     name: tea-svc
     labels:
   spec:
     ports:
     - port: 80
       targetPort: 8080
       protocol: TCP
       name: http
     selector:
       app: tea
   ```

   Примените настройки:
   ```console
   $ kubectl apply -f cafe.yaml
   ```
5. Создайте секрет типа `angie.software/htpasswd` с именем `cafe-passwd`,
   который будет использоваться для базовой аутентификации.
   Секрет должен содержать список пар `user:password` в формате Base64:
   ```yaml
   kind: Secret
   metadata:
     name: cafe-passwd
   apiVersion: v1
   type: angie.software/htpasswd
   stringData:
     htpasswd: |
       foo:$2y$10$e4CiBWaLq9JW93jV8r9CW.RE6fbsT3szmIsUhwqYuPfVlggXiBY76
     # bar
   ```

   Примените настройки:
   ```console
   $ kubectl apply -f cafe-passwd.yaml
   ```
6. Создайте ресурс Ingress для приложения:
   ```yaml
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: cafe-ingress
     annotations:
       angie.software/basic-auth-secret: "cafe-passwd"
       angie.software/basic-auth-realm: "Cafe App"
   spec:
     ingressClassName: angie
     tls:
     - hosts:
       - cafe.example.com
       secretName: cafe-secret
     rules:
     - host: cafe.example.com
       http:
         paths:
         - path: /tea
           pathType: Prefix
           backend:
             service:
               name: tea-svc
               port:
                 number: 80
         - path: /coffee
           pathType: Prefix
           backend:
             service:
               name: coffee-svc
               port:
                 number: 80
   ```

   Примените настройки:
   ```console
   $ kubectl apply -f cafe-ingress.yaml
   ```

   #### NOTE
   Ресурс Ingress должен содержать аннотацию `angie.software/basic-auth-secret`,
   ссылающуюся на секрет `cafe-passwd`, созданный ранее.
7. Протестируйте конфигурацию.

   Если вы попытаетесь получить доступ к приложению без указания
   действительных имени пользователя и пароля, ANIC отклонит запрос:
   ```console
   $ curl --resolve cafe.example.com:$IC_HTTP_PORT:$IC_IP http://cafe.example.com:$IC_HTTP_PORT/
   <html>
   <head><title>401 Authorization Required</title></head>
   <body>
   <center><h1>401 Authorization Required</h1></center>
   <hr><center>Angie/1.8.1</center>
   </body>
   </html>
   ```

   Если указать правильные имя пользователя и пароль, запрос будет успешным:
   ```console
   $ curl --resolve cafe.example.com:$IC_HTTPS_PORT:$IC_IP https://cafe.example.com:$IC_HTTPS_PORT/coffee --insecure -u foo:bar
   Server address: 10.244.0.6:8080
   Server name: coffee-7b9b4bbd99-bdbxm
   Date: 20/Jun/2022:11:43:34 +0000
   URI: /coffee
   Request ID: f91f15d1af17556e552557df2f5a0dd2
   ```

## Пример с отдельными параметрами htpasswd для разных путей

В примере ниже реализована базовая аутентификация для [объединенных (mergeable) ресурсов Ingress](https://angie.software//anic/docs/ingress-resources/mergeable-ingress-types.md#i-mergeable-ingress)
с отдельными списками `user:password` для каждого пути.

Master Ingress:

```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress-master
  annotations:
    angie.software/mergeable-ingress-type: "master"
spec:
  ingressClassName: angie
  tls:
  - hosts:
    - cafe.example.com
    secretName: cafe-secret
  rules:
  - host: cafe.example.com
```

Minion для `/tea`:

```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress-tea-minion
  annotations:
    angie.software/mergeable-ingress-type: "minion"
    angie.software/basic-auth-secret: "tea-passwd"
    angie.software/basic-auth-realm: "Tea"
spec:
  rules:
  - host: cafe.example.com
    http:
      paths:
      - path: /tea
        pathType: Prefix
        backend:
          service:
            name: tea-svc
            port:
              number: 80
```

Minion для `/coffee`:

```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress-coffee-minion
  annotations:
    angie.software/mergeable-ingress-type: "minion"
    angie.software/basic-auth-secret: "coffee-passwd"
    angie.software/basic-auth-realm: "Coffee"
spec:
  rules:
  - host: cafe.example.com
    http:
      paths:
      - path: /coffee
        pathType: Prefix
        backend:
          service:
            name: coffee-svc
            port:
              number: 80
```
