[英]Facebook authentication callback to wrong server with AWS ELB elastic load balancer
最终编辑/结论:
对于下面“上下文”部分中记录的特定用例,粘性会话无济于事。 这指出了在生成身份验证请求之前需要建立会话的需求。 通过设置一个带有指向该路线的链接的页面,该问题不再出现。
问题:
对于在AWS ELB弹性负载均衡器下的多个Web服务器,Facebook身份验证回调可能会定向到服务器,而不是发出身份验证请求。
我们正在使用带有护照的node.js进行身份验证。
语境:
为用户提供了一条特定的路线(例如ourwebsite.com/dofbstuff之类的东西),该路线的处理程序首先对护照进行身份验证:
app.get( '/dofbstuff',
passport.authenticate( 'facebook', {
scope: [ 'email', <snip> 'publish_actions' ],
callbackURL:config.facebook.fbstuffCallback
} )
在这种使用情况下,该应用程序完美地适用于一台应用程序服务器,但是挂在多台服务器上。
题:
解决这个问题的最简单方法是什么?
潜在的解决方案:
passport.use( new FacebookStrategy(...),function(accessToken){ etc. } )
同
callTheAuthenticationServer( function(accessToken){ etc. } )
(续),然后让身份验证服务器向Facebook发布身份验证请求(该请求驻留在其自己的DNS地址中以进行回叫),然后向应用服务器发出响应。 然后,请求将如何转发到身份验证服务器以在客户端(用户的浏览器)上生成Facebook登录对话框?
让应用服务器找出要从NAT转发的端口。 ELB将需要接受URL中带有该端口的Facebook回调(即myserver.com/fbauthcallbackroute:portnumber)。
https://aws.amazon.com/blogs/aws/aws-iam-now-supports-amazon-facebook-and-google-identity-federation/声称“通过集成,也可以为Facebook或Google身份启用类似的流程他们的SDK与您的应用配合使用,并只需创建其他角色即可。” 我不知道这是否意味着您可以使用身份联盟作为获取Facebook令牌的手段。 如果是这样,该过程记录在哪里?
其他说明:
我发现此问题已经发布在此处(在ruby rails环境中): Facebook身份验证+负载平衡器
我还在github上的https://github.com/jaredhanson/passport-facebook/issues/104上记录了一个护照-facebook的错误。
AWS ELB具有“粘性会话”,该粘性会话将在浏览会话期间将特定用户(通过cookie)保留在同一实例上。
另一个选择是设置共享会话存储(AWS ElastiCache非常适合此设置),以便所有服务器将会话存储在同一数据存储中。 这样,用户的会话数据就不特定于单个后端服务器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.