使用AWS ELB弹性负载平衡器将Facebook身份验证回调到错误的服务器

使用AWS ELB弹性负载平衡器将Facebook身份验证回调到错误的服务器,facebook,authentication,amazon-web-services,callback,Facebook,Authentication,Amazon Web Services,Callback,最终编辑/结论: 对于下面“上下文”一节中记录的特定用例,粘性会话没有帮助。这指出了在生成身份验证请求之前需要建立会话。通过设置带有路由链接的页面,问题不会重现 问题: 对于AWS ELB弹性负载平衡器下的多个Web服务器,Facebook身份验证回调可能会指向发出身份验证请求以外的服务器 我们正在使用node.js和passport进行身份验证 背景: 用户被指定了一个特定的路由(类似于ourwebsite.com/dofbstuff),该路由的处理程序首先进行passport身份验证: ap

最终编辑/结论:

对于下面“上下文”一节中记录的特定用例,粘性会话没有帮助。这指出了在生成身份验证请求之前需要建立会话。通过设置带有路由链接的页面,问题不会重现

问题:

对于AWS ELB弹性负载平衡器下的多个Web服务器,Facebook身份验证回调可能会指向发出身份验证请求以外的服务器

我们正在使用node.js和passport进行身份验证

背景:

用户被指定了一个特定的路由(类似于ourwebsite.com/dofbstuff),该路由的处理程序首先进行passport身份验证:

app.get(“/dofbstuff”,
passport.authenticate('facebook',{
范围:[“电子邮件”,“发布操作”],
callbackURL:config.facebook.fbstuffCallback
} )
在这个用例中,该应用程序可以完美地用于一个应用程序服务器,但可以挂起多个服务器

问题:

解决这个问题最简单的方法是什么

可能的解决办法:

  • 在应用服务器上,替换:
  • passport.use(新FacebookStrategy(…),函数(accessToken){etc})
    

    callTheAuthenticationServer(函数(accessToken){etc})
    
  • (续)并让身份验证服务器向Facebook发出身份验证请求(它位于回拨时自己的DNS地址上)并向应用服务器发出响应。然后,如何将请求转发到身份验证服务器以在客户端(用户浏览器)上生成Facebook登录对话框

  • 让应用服务器找出它在NAT上转发的端口。ELB需要在URL中使用该端口接受Facebook回调(即myserver.com/fbauthcallbackroute:portnumber)

  • 声称“通过将Facebook或Google的SDK与你的应用程序集成,并简单地创建一个附加角色,也可以为Facebook或Google身份启用类似的流程。”我不知道这是否意味着你可以使用身份联盟作为获取Facebook令牌的手段。如果是,这个流程记录在哪里

  • 其他说明:

    我发现这个问题已经发布在这里(在ruby rails环境中):

    我还在github上记录了passport facebook的一个错误:

    AWS ELB具有“粘性会话”,这将使特定用户(通过cookie)在其浏览会话期间保持在同一实例上


    另一个选项是设置共享会话存储(AWS ElastiCache非常适合)因此,所有服务器都将会话存储在同一个数据存储中。这样,用户的会话数据并不特定于某个后端服务器。

    抱歉-但我不知道Facebook为其回调创建了这样一个cookie。你真的实现了你所说的吗?@javabrain是的,我实现了这个,它与此无关Facebook方面。粘性会话是ELB AWS控制台中的一个配置选项。auth回调来自Facebook方面。当你告诉Facebook“转到此回调URL”-ELB不知道Facebook发布此get(或post)的上下文在.No?的回调URL处,ELB在用户的浏览器上设置了一个cookie。该cookie在后续访问时告诉ELB您以前在哪个服务器上,并将您的第二个请求发送给同一个服务器。我将您链接到文档。您的群集作为单个服务器群集用于单个用户。因此,粘性会话必须与h将cookie从用户客户端浏览器发送到应用服务器-为该会话维护到同一服务器的流量。但是,当Facebook调用回调URL时,任何其他应用服务器都可能收到该调用。我不知道粘性会话如何解决此问题。我甚至不知道传入的Facebook回调路由如何与特定se关联通过elasticache进行会话(可能有多个会话同时进行,所以它将转到哪个回调)?