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

#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 пока.