Разработка писем и безопасность
Аутентификация запросов в AMP-письмах
XHR-запросы не содержат cookie, поэтому следует идентифицировать пользователя с помощью токенов доступа.
Токен нужен для гарантии, что только тот, кто имеет доступ к AMP-письму, может выполнять содержащиеся в нем запросы. Токены доступа должны быть криптографически защищены и ограничены по времени и объему. Они включены в URL запроса.
Этот пример демонстрирует использование <amp-list> для отображения аутентифицированных данных:
<amp-list src="https://example.com/endpoint?token=REPLACE_WITH_YOUR_ACCESS_TOKEN" <template type="amp-mustache"> ... </template> </amp-list> |
При использовании <amp-form> поместите токен доступа в action-xhr URL:
<form action-xhr="https://example.com/endpoint?token=REPLACE_WITH_YOUR_ACCESS_TOKEN" method="post"> <input type="text" name="data"> <input type="submit" value="Send"> </form> |
Проверка прокси-сервером
Все XHRs, поступающие из AMP-письма, проходят проверку прокси-сервером Mail, чтобы защитить данные пользователя.
Ниже описано, какие заголовки ожидаются в запросе и ответе сервера.
Запрос
Когда письмо обращается за данными через amp-form, amp-list или любой другой компонент, который подлежит проверке CORS, запросы на ваш сервер содержат заголовок AMP-Email-Sender с адресом отправителя письма.
Например:
AMP-Email-Sender: sender@example.com |
Ответ
В ответе ваш сервер может подтвердить, что AMP-Email-Sender — это отправитель, которому можно доверять. Если это не так, сервер может ответить 403 Forbidden и запрос будет отклонен.
Если запрос подтвержден, сервер должен включить в ответ заголовок AMP-Email-Allow-Sender. Значение заголовка может быть:
- адресом отправителя, письмам от которого разрешено отправлять запросы на ваш сервер. В этом случае заголовок ответа повторяет значение заголовка запроса AMP-Email-Sender;
- символом *, если вы хотите разрешить делать запросы на ваш сервер из любых писем. Это значение рекомендуется только для тестовых целей.
Например:
AMP-Email-Allow-Sender: sender@example.com |
Сервер должен соответствующим образом ответить на запрос предварительной проверки (OPTIONS), который содержит заголовок Access-Control-Request-Headers: AMP-Email-Sender. Тем не менее, почтовый клиент не гарантирует выдачу предварительных запросов.
Работа писем вне почтовых клиентов
Обратите внимание, что вышеуказанные требования относятся к отображению писем внутри почтовых клиентов и песочницы Mail. Если вы хотите, чтобы ваши письма также работали и вне почтовых клиентов, вам нужно реализовать стандартный механизм CORS.
При возможности пользуейтесь новой схемой проверки. Скоро мы перестанем поддерживать эту схему проверки прокси-сервисом.
Запросы
Запросы, поступающие от прокси-серверов Mail.ru, содержат следующий заголовок:
Origin: https://e.mail.ru |
Также они могут содержать следующий query-параметр:
__amp_source_origin=<sender email address> |
Например, XHR-запрос от amp-list к https://example.com/data.json, который исходит из письма с адреса sender@example.com, выглядит так:
Request URL: https://example.com/data.json?__amp_source_origin=sender@example.com |
Вы должны проверять эти значения и отклонять любые запросы, которые их не содержат.
Ответы
Все ответы должны содержать три заголовка:
Access-Control-Allow-Origin: https://e.mail.ru |
Например, если письмо отправлено с адреса sender@example.com, заголовки должны включать следующее:
Access-Control-Allow-Origin: https://e.mail.ru |
Если ответ не содержит эти заголовки, прокси-сервер Mail.ru отклонит ответ и пользователь не увидит динамический контент в письме.
Ограничения
XHR URL не должны использовать HTTP-редиректы. Запросы, которые возвращают статус кодов редиректов (например, 302 Found или 308 Permanent Redirect), вызывают ошибку и предупреждение в консоли браузера.
Создание AMP-писем
Чтобы создавать AMP-письма, используйте документацию формата.
Также вы можете использовать наш HTML-редактор для написания AMP-писем. Редактор показывает готовое решение и выделяет ошибки, которые можно исправить там же. Готовый результат вы сразу же сможете отправить себе в почту.
We will help solve the problem