使用NextAuth跨多个域CORS进行身份验证

问题描述

我想从domain1.com到domain2.com进行XHR。 domain2.com是使用NextAuth的NextJS应用。

问题在于,当我执行此请求时,不包括domain2的cookie。我的代码是:

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;
  }

我该怎么做?

解决方法

不幸的是,目前NextAuth.js中对此功能没有明确支持。

您可以set custom cookie policies to support subdomains(例如auth.example.com,www.example.com,cdn.example.com),但是对于完全唯一的域,您现在需要为每个域设置不同的站点。

某些平台(例如Auth0)将其支持为“静默登录”,通常涉及跨域iframe在不同域(其中一个域为“规范”)之间的站点之间传递消息。这项计划性功能很可能在年底之前不会消失。

注意:对于某些OAuth提供程序,您可以将相同的OAuth客户端/秘密使用不同的域,但并非所有提供程序都可以使用,但是,如果仅使用支持此功能的提供程序,则可以将所有实例指向同一个数据库。

PS:如果您对执行此操作感兴趣,从技术上讲,可以使用postMessage API自己(带有或不带有NextAuth.js)来实现此功能,以从屏幕外iframe返回指向页面上的令牌您选择用于登录的“规范” URL;然后您可以读取该令牌以确定用户是否有会话。

这不是很棘手。变得复杂的地方是安全地执行此操作,因为这取决于场景(例如,一个Web应用程序具有多个有效域并且可能具有不同的内容,还是一个位于不同域中的多个完全独立的站点,您是否只对客户端感到满意?饼干)。提供一个对每个人都适用的解决方案是一个棘手的问题,我实际上还不确定在NextAuth.js中会是什么样。