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

时间:2015-01-13 16:17:57

标签: facebook authentication amazon-web-services callback

最终编辑/结论:

对于"上下文"部分中记录的特定用例下面,粘性会话不会有帮助。这指出了在生成认证请求之前建立会话的需要。通过设置包含路径链接的页面,问题无法重现。

问题:

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

我们正在使用带护照的node.js进行身份验证。

上下文:

为用户提供了一条特定的路线(例如mywebsite.com/dofbstuff),该路线的处理程序首先对护照进行身份验证:

    app.get( '/dofbstuff',
        passport.authenticate( 'facebook', {    
                            scope: [ 'email', <snip> 'publish_actions' ],
                            callbackURL:config.facebook.fbstuffCallback
                         } )

在此用例中,该应用程序适用于一个应用服务器,但挂起多个服务器。

问题:

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

潜在的解决方案:

  1. 在应用服务器上,替换:
  2. passport.use( new FacebookStrategy(...),function(accessToken){ etc. } )
    

      callTheAuthenticationServer( function(accessToken){ etc. } )
    
    1. (续)并让身份验证服务器向Facebook发出身份验证请求(它驻留在它自己的DNS回调地址)并向应用服务器发出响应。那么如何将req转发到认证服务器以在客户端(用户的浏览器)上生成Facebook登录对话框?

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

    3. https://aws.amazon.com/blogs/aws/aws-iam-now-supports-amazon-facebook-and-google-identity-federation/声明&#34;通过将SDK与您的应用集成,只需创建一个额外的角色,也可以为Facebook或Google身份启用类似的流程。&#34;我不知道这是否意味着您可以使用Identity Federation作为获取Facebook令牌的手段。如果是,那么这个过程记录在哪里了?

    4. 其他说明:

      我发现此问题已在此处发布(在ruby rails环境中): Facebook Authentication + Load balancer

      我还在github上记录了passport-facebook的错误: https://github.com/jaredhanson/passport-facebook/issues/104

1 个答案:

答案 0 :(得分:2)

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

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