Как я могу отправить запрос API MailChimp через JavaScript в Диспетчере тегов Google?

Я пытаюсь обновить участников MailChimp из Диспетчера тегов Google, используя MailChimp API v3.0, но у меня возникают проблемы. Это мой код, который я запускаю из реального домена (не с локального хоста), защищенного действительным сертификатом SSL (если это имеет значение).

const xmlHttp = new XMLHttpRequest();

xmlHttp.onreadystatechange = () => {
    try {
        if (xmlHttp.readyState !== 4) return;
        if (xmlHttp.status !== 200)
            throw new Error(
                xmlHttp.statusText || 'HTTP STATUS ' + xmlHttp.status
            );
        console.info(xmlHttp.responseText);
    } catch (err) {
        console.error(err);
    }
};

xmlHttp.open('POST', 'https://us12.api.mailchimp.com/3.0/lists/d5bed898ae/members/0740287eb1c63371a10d32ebf58391f9');
xmlHttp.setRequestHeader('Authorization', 'Basic ' + btoa('anystring' + ':' + 'my-api-key-here'));
xmlHttp.setRequestHeader('content-type', 'application/json');
xmlHttp.send('{"email_address":"[email protected]", "status":"subscribed", "member_rating":"4"}');

Я получаю ошибку CORS:

Access to XMLHttpRequest at 'https://us12.api.mailchimp.com/3.0/lists/d5bed898ae/members/0740287eb1c63371a10d32ebf58391f9' from origin 'https://subdomain.example.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Что я делаю неправильно?

Обновлено:

Обратите внимание, я не пытаюсь добавить нового участника, я пытаюсь обновить существующего. Также ключ API не виден, я подбираю его как переменную GTM. Также код работает на домене, так как GTM загружается на страницу.

Где я должен запустить этот код? На серверах Mailchimp? Что мне не хватает?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
780
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Прежде всего, ЕЕК! Вы должны никогда поместить закрытый ключ API в клиентский код, в данном случае в GTM. Если посетитель веб-сайта заметил это, он мог легко использовать ваш API-ключ, чтобы делать с вашей учетной записью Mailchimp практически все, что он хотел, включая удаление всего в ней. Из документации Mailchimp:

API keys grant full access to your Mailchimp account and should be protected the same way you would protect your password.

Если вы уже запустили этот код, даже всего на несколько минут, вы захотите немедленно отключить/отозвать этот ключ API и создать новый.


Во-вторых, ошибка CORS связана с тем, что MailChimp специально не поддерживает запросы API, которые исходят от браузеров из-за пределов их собственного домена, например. Запросы между источниками, требующие правильного заголовка ответа CORS. Причина этого та же, что и в моем предупреждении выше — вы не должны выполнять вызовы API из кода на стороне клиента из-за присущих угроз безопасности. На той же странице документа MailChimp они повторяют это предупреждение:

Because of the potential security risks associated with exposing account API keys, Mailchimp does not support client-side implementation of our API using CORS requests or including API keys in mobile apps.

См. этот вопрос StackOverflow для аналогичного обсуждения.


Чтобы решить эту проблему, вам нужно, чтобы фактический вызов API исходил из фактического кода на стороне сервера. Большинство людей, вероятно, проксируют запрос через свой собственный сайт, поэтому, если ваш сайт — example.com, вы можете заставить GTM сделать вызов AJAX к example.com/mailchimp-proxy.php?action=update&list=d5bed898ae&user=0740287eb1c63371a10d32ebf58391f9&info=..., а затем этот PHP-скрипт, в свою очередь, вызовет реальную конечную точку API https://us12.api.mailchimp.com/3.0/... с данными. Поскольку код выполняется на стороне сервера, если вы правильно вставите в него свой ключ, никто не сможет его прочитать.

Другой альтернативой является использование чего-то вроде Запир или «бессерверных» функций для прокси-запроса, поэтому вам не нужно запускать собственный сервер.

Спасибо, Джошуа, я не пытаюсь добавить нового участника, я пытаюсь обновить существующего. Также ключ API не виден, я подбираю его как переменную GTM.

Ciprian 22.05.2019 11:01

Также код работает на домене, так как GTM загружается на страницу. Где я должен запустить этот код? На серверах Mailchimp? Что мне не хватает?

Ciprian 22.05.2019 11:33

A) Переменные GTM доступны для чтения любому, кто загружает страницу, на которой находится тег, просто нужно открыть инспектор или другой инструмент разработчика. и B) Это подразумевалось моим ответом и другим ответом SO, на который я ссылался, но я мог бы быть немного более явным (я, вероятно, отредактирую свой ответ выше) - я думаю, что вам не хватает, это то, что вам нужно иметь запрос поступает с реального сервера. Большинство людей, вероятно, будут использовать свой собственный сервер и «проксировать» запрос через него — поэтому, если ваш сайт — example.com, GTM запрашивает example.com/updatemailchimp.php, который затем, в свою очередь, вызывает us12.api.mailchimp.com/3.0.

Joshua T 22.05.2019 19:51

Понимаю. Я не могу использовать прокси, так как сервер C#. Тогда я передам это разработчику C#. Переменные GTM недоступны для чтения никому за пределами GTM. Вы можете объявить переменную GTM из атрибута данных, вызова API или элемента на странице. Переменные GTM объявляются только внутри GTM, снаружи они не существуют. Спасибо, я приму ваш ответ.

Ciprian 23.05.2019 13:17

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