Single sign on 为什么使用Bluemix单点登录服务的应用程序在水平缩放时返回404?

Single sign on 为什么使用Bluemix单点登录服务的应用程序在水平缩放时返回404?,single-sign-on,ibm-cloud,Single Sign On,Ibm Cloud,我有一个简单的Node.js应用程序,使用express 4.12和express session 1.11.2,使用Bluemix的单点登录(SSO)服务。当存在单个应用程序实例时,它可以正常工作,但当应用程序手动或自动缩放到两个实例时,在用户提供其凭据后,它将返回404 我使用cf日志检查应用程序的日志,在这两种情况下,在身份验证后,应用程序回调都按预期调用: 正在工作(一个应用程序实例): 不工作(两个应用程序实例): 我希望在回调的GET请求中使用不同的代码参数,这样就可以了 为了获得更

我有一个简单的Node.js应用程序,使用express 4.12和express session 1.11.2,使用Bluemix的单点登录(SSO)服务。当存在单个应用程序实例时,它可以正常工作,但当应用程序手动或自动缩放到两个实例时,在用户提供其凭据后,它将返回404

我使用cf日志检查应用程序的日志,在这两种情况下,在身份验证后,应用程序回调都按预期调用:

正在工作(一个应用程序实例):

不工作(两个应用程序实例):

我希望在回调的GET请求中使用不同的代码参数,这样就可以了

为了获得更多调试信息,我添加了一个console.log语句,该语句在将用户定向到SSO服务进行身份验证之前运行。在回调中处理时,passport openid connect节点模块(strategy.js)也会将输出记录到控制台。当一切正常工作时,输出如下所示:

2015-07-06T16:22:40.99-0700 [RTR]     OUT ssolab-20150601tor.mybluemix.net - [06/07/2015:23:22:40 +0000] "GET /hello HTTP/1.1" 302 0 68 "https://ssolab-20150601tor.mybluemix.net/" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)" 75.126.70.46:15290 x_forwarded_for:"-" vcap_request_id:fe3c942d-7ae2-4500-6274-b1ecf95f24e5 response_time:0.009553663 app_id:8b9f5b57-fbbd-4387-9cda-3737ad1f02ad
2015-07-06T16:22:41.01-0700 [App/0]   OUT Request by unauthenticated user
其次是:

2015-07-06T16:22:54.67-0700 [RTR]     OUT ssolab-20150601tor.mybluemix.net - [06/07/2015:23:22:54 +0000] "GET /auth/sso/callback?scope=openid&code=QkXlFtOEpBkNBJdo4tSvQA6qUlw7Q7 HTTP/1.1" 302 0 68 "https://bestssoever-2zgs9sg44w-cge7.iam.ibmcloud.com/idaas/mtfim/sps/default/oidc/consent" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)" 75.126.70.46:29117 x_forwarded_for:"-" vcap_request_id:ca85eb7a-8b54-4bc1-43a7-2cff279de499 response_time:0.223288172 app_id:8b9f5b57-fbbd-4387-9cda-3737ad1f02ad
2015-07-06T16:22:54.68-0700 [App/0]   OUT TOKEN
对于两个应用程序实例,初始应用程序流量似乎将流向一个实例:

2015-07-02T10:11:38.45-0700 [RTR]     OUT ssolab-20150601tor.mybluemix.net - [02/07/2015:17:11:38 +0000] "GET /auth/sso/callback?scope=openid&code=JaoWziZSyRNNwrBDECRiWBSNHSl0CF HTTP/1.1" 302 0 68 "https://bestssoever-2zgs9sg44w-cge7.iam.ibmcloud.com/idaas/mtfim/sps/default/oidc/consent" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko" 75.126.70.43:34370 x_forwarded_for:"-" vcap_request_id:ec975656-70ae-44d8-4071-5b2d3b92e041 response_time:0.185715429 app_id:8b9f5b57-fbbd-4387-9cda-3737ad1f02ad 
2015-07-06T16:37:17.68-0700 [RTR]     OUT ssolab-20150601tor.mybluemix.net - [06/07/2015:23:37:17 +0000] "GET /hello HTTP/1.1" 302 0 68 "https://ssolab-20150601tor.mybluemix.net/" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)" 75.126.70.42:24841 x_forwarded_for:"-" vcap_request_id:491b5a52-653d-4fdc-6364-f604b3da395b response_time:0.008679282 app_id:8b9f5b57-fbbd-4387-9cda-3737ad1f02ad
2015-07-06T16:37:17.68-0700 [App/0]   OUT Request by unauthenticated user
2015-07-06T16:37:51.01-0700 [RTR]     OUT ssolab-20150601tor.mybluemix.net - [06/07/2015:23:37:50 +0000] "GET /auth/sso/callback?scope=openid&code=ylZKV3IPWMZgo2MNvwt9JxJzjU2Lsj HTTP/1.1" 404 0 83 "https://bestssoever-2zgs9sg44w-cge7.iam.ibmcloud.com/idaas/mtfim/sps/default/oidc/consent" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)" 75.126.70.43:48635 x_forwarded_for:"-" vcap_request_id:44b7893c-b185-4651-5384-7957a598bc20 response_time:0.273983071 app_id:8b9f5b57-fbbd-4387-9cda-3737ad1f02ad
2015-07-06T16:37:51.00-0700 [App/1]   OUT TOKEN
而回调调用似乎由另一个实例处理:

2015-07-02T10:11:38.45-0700 [RTR]     OUT ssolab-20150601tor.mybluemix.net - [02/07/2015:17:11:38 +0000] "GET /auth/sso/callback?scope=openid&code=JaoWziZSyRNNwrBDECRiWBSNHSl0CF HTTP/1.1" 302 0 68 "https://bestssoever-2zgs9sg44w-cge7.iam.ibmcloud.com/idaas/mtfim/sps/default/oidc/consent" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko" 75.126.70.43:34370 x_forwarded_for:"-" vcap_request_id:ec975656-70ae-44d8-4071-5b2d3b92e041 response_time:0.185715429 app_id:8b9f5b57-fbbd-4387-9cda-3737ad1f02ad 
2015-07-06T16:37:17.68-0700 [RTR]     OUT ssolab-20150601tor.mybluemix.net - [06/07/2015:23:37:17 +0000] "GET /hello HTTP/1.1" 302 0 68 "https://ssolab-20150601tor.mybluemix.net/" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)" 75.126.70.42:24841 x_forwarded_for:"-" vcap_request_id:491b5a52-653d-4fdc-6364-f604b3da395b response_time:0.008679282 app_id:8b9f5b57-fbbd-4387-9cda-3737ad1f02ad
2015-07-06T16:37:17.68-0700 [App/0]   OUT Request by unauthenticated user
2015-07-06T16:37:51.01-0700 [RTR]     OUT ssolab-20150601tor.mybluemix.net - [06/07/2015:23:37:50 +0000] "GET /auth/sso/callback?scope=openid&code=ylZKV3IPWMZgo2MNvwt9JxJzjU2Lsj HTTP/1.1" 404 0 83 "https://bestssoever-2zgs9sg44w-cge7.iam.ibmcloud.com/idaas/mtfim/sps/default/oidc/consent" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)" 75.126.70.43:48635 x_forwarded_for:"-" vcap_request_id:44b7893c-b185-4651-5384-7957a598bc20 response_time:0.273983071 app_id:8b9f5b57-fbbd-4387-9cda-3737ad1f02ad
2015-07-06T16:37:51.00-0700 [App/1]   OUT TOKEN

导致404的原因是Passport与express一起使用的express会话中间件有一个默认存储,它位于内存中,不能扩展到单个进程(请参阅下面的警告:)

在失败的调试日志片段中,在将身份验证委托给SSO之前,Passport使用由App/0中的express session管理的会话对象。但是,调用回调时,请求由App/1处理,该实例中的express会话对原始会话不可见

我通过使用connect redis和Bluemix的redis云服务为express session实现一个备用(和持久)会话存储来验证这一假设

将express session配置为将会话持久化到此存储后,当应用程序的多个实例处于活动状态时,404错误消失