Аутентификация в нескольких доменах (CORS) с NextAuth

Я хочу сделать XHR с domain1.com на domain2.com. domain2.com - это приложение NextJS, использующее NextAuth.

Проблема в том, что когда я делаю этот запрос, файлы cookie домена 2 не включаются. Мой код:

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, http://www.example.com, cdn.example.com), но для полностью уникальных доменов в настоящее время вам нужно будет настроить разные сайты для каждого домена.

Это поддерживается некоторыми платформами, такими как Auth0, как "тихий вход", обычно с использованием междоменных фреймов для передачи сообщений между сайтами на разных доменах (при этом один домен является "каноническим"). Это запланированная функция, которая вряд ли упадет до конца года.

Примечание. Для некоторых поставщиков OAuth вы можете использовать разные домены с одним и тем же клиентом / секретом OAuth, но это не относится ко всем поставщикам, однако, если вы используете только поставщиков, которые поддерживают это, вы можете указать все экземпляры в одной базе данных.

PS: Если вам интересно, как это сделать, технически можно реализовать это самостоятельно (с NextAuth.js или без него), используя postMessage API, чтобы вернуть токен из внеэкранного iframe, который указывает на страницу с `` каноническим '' URL-адресом, который вы выберите для входа; а затем вы можете прочитать этот токен, чтобы определить, есть ли у пользователя сеанс.

Это не так уж сложно. Там, где это усложняется, делать это безопасно, поскольку то, что это означает, зависит от сценария (например, это одно веб-приложение с несколькими действительными доменами и, возможно, разным контентом, или это несколько полностью отдельных сайтов в разных доменах, и будете ли вы довольны только клиентской стороной печенье). Сложно предоставить единое решение, которое будет хорошо работать для всех, и я пока не уверен, как это будет выглядеть в NextAuth.js.

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