使用 NextAuth 跨多个域 (CORS) 进行身份验证
Authentication across across multiple domains (CORS) with NextAuth
我想做一个从 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 (e.g. auth.example.com, www.example.com、cdn.example.com),但对于目前完全唯一的域,您需要为每个域设置不同的站点。
某些平台支持此功能,例如 Auth0 'silent login',通常涉及跨域 iframe 在不同域(一个域为 'canonical')的站点之间传递消息。这是一项计划中的功能,年底前可能不会放弃。
注意:对于某些 OAuth 提供程序,您可以使用具有相同 OAuth Client/Secret 的不同域,但并非所有提供程序都如此,但是如果您仅使用支持此功能的提供程序,则可以指向所有同一数据库中的实例。
PS:如果您对如何执行此操作感兴趣,从技术上讲,可以使用 postMessage API 到 return 自己实现(有或没有 NextAuth.js)来自屏幕外 iframe 的标记,它指向您选择登录的 'canonical' URL 上的页面;然后您可以读取该令牌以确定用户是否有会话。
做起来并不难。变得复杂的地方是安全地执行此操作,因为这意味着什么取决于场景(例如,它是一个具有多个有效域和可能不同内容的 Web 应用程序,还是在不同域上的多个完全独立的站点,您是否只对客户端感到满意饼干)。这是一个棘手的问题,要提供一个适用于每个人的单一解决方案,我实际上还不确定在 NextAuth.js 中会是什么样子。
我想做一个从 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 (e.g. auth.example.com, www.example.com、cdn.example.com),但对于目前完全唯一的域,您需要为每个域设置不同的站点。
某些平台支持此功能,例如 Auth0 'silent login',通常涉及跨域 iframe 在不同域(一个域为 'canonical')的站点之间传递消息。这是一项计划中的功能,年底前可能不会放弃。
注意:对于某些 OAuth 提供程序,您可以使用具有相同 OAuth Client/Secret 的不同域,但并非所有提供程序都如此,但是如果您仅使用支持此功能的提供程序,则可以指向所有同一数据库中的实例。
PS:如果您对如何执行此操作感兴趣,从技术上讲,可以使用 postMessage API 到 return 自己实现(有或没有 NextAuth.js)来自屏幕外 iframe 的标记,它指向您选择登录的 'canonical' URL 上的页面;然后您可以读取该令牌以确定用户是否有会话。
做起来并不难。变得复杂的地方是安全地执行此操作,因为这意味着什么取决于场景(例如,它是一个具有多个有效域和可能不同内容的 Web 应用程序,还是在不同域上的多个完全独立的站点,您是否只对客户端感到满意饼干)。这是一个棘手的问题,要提供一个适用于每个人的单一解决方案,我实际上还不确定在 NextAuth.js 中会是什么样子。