#cookies #cross-domain #next.js #next-auth
#файлы cookie #междоменный #next.js #следующая аутентификация
Вопрос:
Я хочу выполнить XHR из domain1.com чтобы domain2.com . domain2.com это приложение NextJS, использующее NextAuth.
Проблема в том, что когда я выполняю этот запрос, файлы cookie domain2 не включаются. Мой код:
var httpRequest = new XMLHttpRequest();
httpRequest.onreadystatechange = function(){
if (httpRequest.readyState === XMLHttpRequest.DONE) {
if (httpRequest.status === 200) {
alert('send successful')
} else {
alert('Error:' httpRequest.responseText)
}
}
};
httpRequest.withCredentials = true;
httpRequest.open('GET', url, true);
httpRequest.send();
Код сервера:
const session = await getSession({ req })
if(session == undefined || session.accessToken == undefined) {
res.statusCode = 500;
res.send(JSON.stringify({'error': 'Not logged in'}));
return;
}
Как я могу это сделать?
Ответ №1:
К сожалению, это явно не поддерживается в NextAuth.js на данный момент.
Вы можете настроить пользовательские политики использования файлов cookie для поддержки поддоменов (например auth.example.com , www.example.com , cdn.example.com ) но для совершенно уникальных доменов в настоящее время вам нужно будет настроить разные сайты для каждого домена.
Это поддерживается некоторыми платформами, такими как Auth0, как «тихий вход», обычно с использованием междоменных фреймов iframe для передачи сообщений между сайтами в разных доменах (при этом один домен является «каноническим»).). Эта запланированная функция, вероятно, вряд ли будет отключена до конца года.
Примечание: Для некоторых поставщиков OAuth вы можете использовать разные домены с одним и тем же клиентом / секретом OAuth OAuth, но это не относится ко всем поставщикам, однако, если вы используете только поставщиков, которые поддерживают это, вы можете указать все экземпляры в одной базе данных.
PS: Если вам интересно, как это сделать, технически это возможно реализовать самостоятельно (с или без NextAuth.js ) использование API postMessage для возврата токена из iframe вне экрана, который указывает на страницу по «каноническому» URL, который вы выбираете для входа; и затем вы можете прочитатьэтот токен определяет, есть ли у пользователя сеанс.
Это не так уж сложно сделать. Где это усложняется, так это безопасное выполнение, поскольку то, что это означает, зависит от сценария (например, это одно веб-приложение с несколькими допустимыми доменами и, возможно, разным контентом, или это несколько совершенно отдельных сайтов в разных доменах, и вы были бы довольны только файлами cookie на стороне клиента). Это сложно обеспечить единое решение, которое хорошо работает для всех, и я на самом деле не уверен, как это будет выглядеть в NextAuth.js пока.