Express 使用第三方登录的Auth0 LoopbackJS API访问令牌

Express 使用第三方登录的Auth0 LoopbackJS API访问令牌,express,passport.js,loopbackjs,Express,Passport.js,Loopbackjs,我目前将loopbackJS api托管在域上(例如),并通过Auth0设置第三方身份验证。我在另一个域上有一个作为SPA托管的前端(例如) 当前端与API位于同一域时,环回组件passport似乎工作正常,它相应地设置userId和access\u tokencookies。但是,我的生产前端与API位于不同的域上,例如,API auth链接类似: ”http://backend.com/auth/auth0?returnTo=“+encodeURIComponent(”http://fron

我目前将loopbackJS api托管在域上(例如),并通过Auth0设置第三方身份验证。我在另一个域上有一个作为SPA托管的前端(例如)

当前端与API位于同一域时,环回组件passport似乎工作正常,它相应地设置
userId
access\u token
cookies。但是,我的生产前端与API位于不同的域上,例如,API auth链接类似:

”http://backend.com/auth/auth0?returnTo=“+encodeURIComponent(”http://frontend.com“”

后端使用了与中相同的auth模式,其中一个
providers.json
文件指定Auth0的连接详细信息(尽管我也尝试过其他社交提供商,如Facebook)

前端()在页面上有一个链接,可以重定向到API身份验证:

<a href="http://backend.com/auth/auth0">Login</a>

单击此链接将正确重定向到Auth0,我可以登录。然后它重定向到指定的目标(或,以指定的为准)。
returnTo
查询参数似乎也按预期工作


在重定向回前端之前,是否有方法捕获
访问令牌
,并以某种方式进行通信(例如,查询参数,除非这太不安全)。

经过进一步调查,我决定使用此方法从loopbackjs后端传递访问令牌和用户ID,到一个单独的前端。这是一个github pull请求,使用passport configurator的customCallback

其他引用此的地方有,和

这里有两个选项,或者使用fork of loopback组件passport(例如上面的一个)作为您的npm依赖项,或者提供customCallback作为passport配置选项

我希望对URL的格式有更多的控制,所以最终使用customCallback方法。在中,在
/server/server.js
中有一些基本代码,用于将
providers.json
传递给passport configurator:

var config = {};
try {
  config = require('../providers.json');
} catch (err) {
  console.trace(err);
  process.exit(1); // fatal
}
passportConfigurator.init();
for (var s in config) {
  var c = config[s];
  c.session = c.session !== false;
  passportConfigurator.configureProvider(s, c);
}
这基本上可以用记录在案的customCallback代码代替,passport变量由passportConfigurator.init()赋值:

在上面的示例中,我基本上复制了
passport configurator.js
中使用的
successRedirect
函数,以使用相同的
returnTo
查询参数。可以设置
providers.json
中的一个选项,例如
“redirectWithToken”:true
,这只会导致对需要外部重定向的身份验证策略进行重定向

如果需要
returnTo
重定向,则再增加最后一位代码。如果它作为查询参数存在,则应在会话级别添加:

app.use(function(req, res, next) {
  var returnTo = req.query.returnTo;
  if (returnTo) {
    req.session = req.session || {};
    req.session.returnTo = require('querystring').unescape(returnTo);
  }
  next();
});
现在,如果后端api位于诸如
http://api.com
,前端托管在另一个域中,例如
http://gui.com
,可在前端放置身份验证链接:

<a href="http://api.com/auth/facebook?returnTo=http%3A%2F%2Fgui.com">Login!</a>

这将导致API auth调用,然后重定向回带有查询参数中的访问令牌和用户ID的
returnTo
链接


将来可能会合并其中一个问题或其他拉取请求,这可能为第三方域重定向提供更理想的方法,但在此之前,此方法工作正常。

您[无法将Cookie从一个域传递到另一个域][。您需要找到另一种方法来获取访问令牌(顺便说一下,我认为这是一个环回生成的访问令牌,而不是oauth临时令牌)您能否提供一些关于外部API和服务器应用程序分发客户端文件的详细信息,以便我可以制定一个答案谢谢,我已经修改了这个问题,并提供了一些关于细节的详细信息。最好假设域分离来处理这个问题,或者如果可能的话,将前端和API放在同一个位置会更好吗域来解决这个问题?除非你有很好的理由使用两个域,否则使用一个域来处理REST api和分发前端文件要简单得多。关于子域,你认为这种情况可以通过将api和前端保持在同一个域,但不同的子域来解决吗谢谢你!
app.use(function(req, res, next) {
  var returnTo = req.query.returnTo;
  if (returnTo) {
    req.session = req.session || {};
    req.session.returnTo = require('querystring').unescape(returnTo);
  }
  next();
});
<a href="http://api.com/auth/facebook?returnTo=http%3A%2F%2Fgui.com">Login!</a>