<!-- review: finished -->

<a id="adc-mail-auth-http"></a>

# Auth HTTP

Модуль позволяет выполнять аутентификацию на основе дополнительного HTTP-запроса
перед обработкой основного запроса. Если подзапрос возвращает статус 2xx,
основной запрос продолжается; если возвращается 401 или 403, пользователю
отправляется соответствующая ошибка, а при любом другом статусе возвращается
ошибка 500. Такой подход обычно используется для передачи аутентификации внешним
сервисам, объединения аутентификации в разных приложениях или интеграции со
сторонними системами, такими как OAuth или LDAP.

<a id="adc-directives-57"></a>

## Директивы

<a id="adc-m-auth-http"></a>

### auth_http

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `auth_http` uri;   |
|------------------------------------------------------------------------------------------|--------------------|
| По умолчанию                                                                             | —                  |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | mail, server       |

Задает URL HTTP-сервера аутентификации. Протокол описан [ниже](https://angie.software//angie/docs/configuration/modules/mail/mail_auth_http.md#v-m-protocol).

<a id="adc-m-auth-http-header"></a>

### auth_http_header

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `auth_http_header` заголовок значение;   |
|------------------------------------------------------------------------------------------|------------------------------------------|
| По умолчанию                                                                             | —                                        |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | mail, server                             |

Добавляет указанный заголовок к запросам, посылаемым на сервер аутентификации. Заголовок можно использовать в качестве shared secret для проверки, что запрос поступил от Angie. Например:

```nginx
auth_http_header X-Auth-Key "secret_string";
```

<a id="adc-m-auth-http-pass-client-cert"></a>

### auth_http_pass_client_cert

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `auth_http_pass_client_cert` `on` | `off`;   |
|------------------------------------------------------------------------------------------|----------------------------------------------|
| По умолчанию                                                                             | `auth_http_pass_client_cert off;`            |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | mail, server                                 |

Добавляет заголовок `Auth-SSL-Cert` с [клиентским сертификатом](https://angie.software//angie/docs/configuration/modules/mail/mail_ssl.md#m-ssl-verify-client) в формате PEM (закодирован в формате urlencode) к запросам, посылаемым на сервер аутентификации.

<a id="adc-m-auth-http-timeout"></a>

### auth_http_timeout

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `auth_http_timeout` время;   |
|------------------------------------------------------------------------------------------|------------------------------|
| По умолчанию                                                                             | `auth_http_timeout 60s;`     |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | mail, server                 |

Задает таймаут общения с сервером аутентификации.

<a id="adc-v-m-protocol"></a>

## Протокол

Для общения с сервером аутентификации используется протокол HTTP. Данные в теле ответа игнорируются, информация передается только в заголовках.

<a id="adc-examples-of-requests-and-responses"></a>

### Примеры запросов и ответов:

Запрос:

```console
GET /auth HTTP/1.0
Host: localhost
Auth-Method: plain # plain/apop/cram-md5/external/xoauth2/oauthbearer/none
Auth-User: user
Auth-Pass: password
Auth-Protocol: imap # imap/pop3/smtp
Auth-Login-Attempt: 1
Client-IP: 192.0.2.42
Client-Host: client.example.org
```

Хороший ответ:

```console
HTTP/1.0 200 OK
Auth-Status: OK
Auth-Server: 198.51.100.1
Auth-Port: 143
```

Плохой ответ:

```console
HTTP/1.0 200 OK
Auth-Status: Invalid login or password
Auth-Wait: 3
```

Если заголовка `Auth-Wait` нет, то после выдачи ошибки соединение будет закрыто. В текущей реализации на каждую попытку аутентификации выделяется память, которая освобождается только при завершении сессии. Поэтому число неудачных попыток аутентификации в рамках одной сессии должно быть ограничено — после 10-20 попыток (номер попытки передается в заголовке `Auth-Login-Attempt`) сервер должен выдать ответ без заголовка `Auth-Wait`.

При использовании APOP или CRAM-MD5 запрос и ответ будут выглядеть так:

```console
GET /auth HTTP/1.0
Host: localhost
Auth-Method: apop
Auth-User: user
Auth-Salt: <238188073.1163692009@mail.example.com>
Auth-Pass: auth_response
Auth-Protocol: imap
Auth-Login-Attempt: 1
Client-IP: 192.0.2.42
Client-Host: client.example.org
```

Хороший ответ:

```console
HTTP/1.0 200 OK
Auth-Status: OK
Auth-Server: 198.51.100.1
Auth-Port: 143
Auth-Pass: plain-text-pass
```

При использовании XOAUTH2 или OAUTHBEARER заголовки `Auth-User` и
`Auth-Pass` содержат имя пользователя и токен bearer, извлеченные из
начального SASL-ответа.

Если в ответе есть заголовок `Auth-User`, то он переопределяет имя пользователя, используемое для аутентификации с бэкендом.

Для SMTP в ответе дополнительно учитывается заголовок `Auth-Error-Code` — если он есть, то используется как код ответа в случае ошибки. Если его нет, то по умолчанию к `Auth-Status` будет добавлен код 535 5.7.0.

Для XOAUTH2 и OAUTHBEARER в ответе с ошибкой также может присутствовать
заголовок `Auth-Error-SASL`. Его значение отправляется клиенту как
дополнительный SASL-вызов (SMTP: 334, IMAP/POP3: +). После ответа клиента
(пустой ответ для XOAUTH2 или `AQ==` для OAUTHBEARER) будет возвращена
ошибка из `Auth-Status`.

Например, если от сервера аутентификации будет получен ответ:

```console
HTTP/1.0 200 OK
Auth-Status: Temporary server problem, try again later
Auth-Error-Code: 451 4.3.0
Auth-Wait: 3
```

то по SMTP клиенту будет выдана ошибка

```console
451 4.3.0 Temporary server problem, try again later
```

Если при проксировании SMTP не требуется аутентификация, запрос будет выглядеть так:

```console
GET /auth HTTP/1.0
Host: localhost
Auth-Method: none
Auth-User:
Auth-Pass:
Auth-Protocol: smtp
Auth-Login-Attempt: 1
Client-IP: 192.0.2.42
Client-Host: client.example.org
Auth-SMTP-Helo: client.example.org
Auth-SMTP-From: MAIL FROM: <>
Auth-SMTP-To: RCPT TO: <postmaster@mail.example.com>
```

Для клиентского соединения по протоколу SSL/TLS добавляется заголовок `Auth-SSL`, и если директива [ssl_verify_client](https://angie.software//angie/docs/configuration/modules/mail/mail_ssl.md#m-ssl-verify-client) включена, заголовок `Auth-SSL-Verify` содержит результат проверки клиентского сертификата: `SUCCESS`, `FAILED:reason` и, если сертификат не был предоставлен, `NONE`.

Если клиентский сертификат был предоставлен, информация о нем передается в следующих заголовках запроса: `Auth-SSL-Subject`, `Auth-SSL-Issuer`, `Auth-SSL-Serial` и `Auth-SSL-Fingerprint`. Если директива [auth_http_pass_client_cert](https://angie.software//angie/docs/configuration/modules/mail/mail_auth_http.md#m-auth-http-pass-client-cert) включена, сам сертификат передается в заголовке `Auth-SSL-Cert`. Протокол и шифр установленного соединения передаются в заголовках `Auth-SSL-Protocol` и `Auth-SSL-Cipher`. Запрос будет выглядеть так:

```console
GET /auth HTTP/1.0
Host: localhost
Auth-Method: plain
Auth-User: user
Auth-Pass: password
Auth-Protocol: imap
Auth-Login-Attempt: 1
Client-IP: 192.0.2.42
Auth-SSL: on
Auth-SSL-Protocol: TLSv1.3
Auth-SSL-Cipher: TLS_AES_256_GCM_SHA384
Auth-SSL-Verify: SUCCESS
Auth-SSL-Subject: /CN=example.com
Auth-SSL-Issuer: /CN=example.com
Auth-SSL-Serial: C07AD56B846B5BFF
Auth-SSL-Fingerprint: 29d6a80a123d13355ed16b4b04605e29cb55a5ad
```

При использовании [протокола PROXY](https://angie.software//angie/docs/configuration/modules/mail/index.md#m-listen-ssl-proxy), информация о нем передается в следующих заголовках запроса: `Proxy-Protocol-Addr`, `Proxy-Protocol-Port`, `Proxy-Protocol-Server-Addr` и `Proxy-Protocol-Server-Port`.
