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

Xod*_*rap 6 cookies cross-domain next.js next-auth

我想做一个从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();
Run Code Online (Sandbox Code Playgroud)

服务器代码:

  const session = await getSession({ req })
  if(session == undefined || session.accessToken == undefined) { 
    res.statusCode = 500;
    res.send(JSON.stringify({'error': 'Not logged in'}));
    return;
  }
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Iai*_*ins 4

不幸的是,目前 NextAuth.js 并未明确支持这一点。

您可以设置自定义 cookie 策略来支持子域(例如 auth.example.com、www.example.com、cdn.example.com),但对于完全唯一的域,目前您需要为每个域设置不同的站点。

Auth0 等一些平台支持“静默登录”,通常涉及跨域 iframe 在不同域的站点之间传递消息(其中一个域是“规范的”)。这是一项计划中的功能,可能在今年年底之前不太可能放弃。

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

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

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