使用 AWS ELB 弹性负载均衡器将 Facebook 身份验证回调到错误的服务器
Facebook authentication callback to wrong server with AWS ELB elastic load balancer
最终 Edit/Conclusion:
对于下面 "context" 部分中记录的特定用例,粘性会话无济于事。这指出在生成身份验证请求之前需要建立会话。通过设置带有 link 路由的页面,问题没有重现。
问题:
对于 AWS ELB 弹性负载均衡器下的多个网络服务器,Facebook 身份验证回调可能会指向发出身份验证请求以外的服务器。
我们使用 node.js 和护照进行身份验证。
上下文:
用户被赋予了一条特定的路线(类似于我们的网站。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/ 声明 "A similar flow can also be enabled for Facebook or Google identities by integrating their SDKs with your app and simply creating an additional role." 我不知道这是否意味着您可以使用身份联合作为获取 Facebook 令牌的方式。如果是这样,这个过程在哪里记录?
其他说明:
我发现这个问题已经发布在这里(在 ruby rails 环境中):
Facebook Authentication + Load balancer
我还在 github 上记录了 passport-facebook 的错误:
https://github.com/jaredhanson/passport-facebook/issues/104
AWS ELB 有 "sticky sessions",它将在浏览会话期间将特定用户(通过 cookie)保持在同一实例上。
另一种选择是设置共享会话存储(AWS ElastiCache 非常适合此操作),以便所有服务器将会话存储在同一数据存储中。这样,用户的会话数据就不会特定于单个后端服务器。
最终 Edit/Conclusion:
对于下面 "context" 部分中记录的特定用例,粘性会话无济于事。这指出在生成身份验证请求之前需要建立会话。通过设置带有 link 路由的页面,问题没有重现。
问题:
对于 AWS ELB 弹性负载均衡器下的多个网络服务器,Facebook 身份验证回调可能会指向发出身份验证请求以外的服务器。
我们使用 node.js 和护照进行身份验证。
上下文:
用户被赋予了一条特定的路线(类似于我们的网站。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/ 声明 "A similar flow can also be enabled for Facebook or Google identities by integrating their SDKs with your app and simply creating an additional role." 我不知道这是否意味着您可以使用身份联合作为获取 Facebook 令牌的方式。如果是这样,这个过程在哪里记录?
其他说明:
我发现这个问题已经发布在这里(在 ruby rails 环境中): Facebook Authentication + Load balancer
我还在 github 上记录了 passport-facebook 的错误: https://github.com/jaredhanson/passport-facebook/issues/104
AWS ELB 有 "sticky sessions",它将在浏览会话期间将特定用户(通过 cookie)保持在同一实例上。
另一种选择是设置共享会话存储(AWS ElastiCache 非常适合此操作),以便所有服务器将会话存储在同一数据存储中。这样,用户的会话数据就不会特定于单个后端服务器。