参考nodebb-plugin-sso-session写了个sso登录插件,但出现了些问题,表现在主站登录后并没有在nodebb登录成功,有时十几次出现一次,有时候频繁出现。在nodebb中打日志发现登录不了的时候有以下现象:
-
从主站同步数据成功,处理完continueLogin函数,来到src/controllersauthentication.js中的authenticationController.onSuccessfulLogin(),这时生成了req.session.passport:
10/1 09:21:27 [37124] - info: onSuccessLogIn sessionId=gjeFe8KsBiXlbbPkEMgnHxrD1l_KPzb1 req.session={"cookie":{"originalMaxAge":1209600000,"expires":"2017-01-24T01:21:27.133Z","httpOnly":true,"domain":".mydomain.cn","path":"/"},"csrfSecret":"SgW2ayatX0nQMhvStH_jan2T","passport":{"user":6},"meta":{"ip":"127.0.0.1","uuid":"42cea1ef-2f58-417f-a31e-c9fb8cb8f8d6","datetime":1484011287135,"platform":"Microsoft Windows","browser":"Chrome","version":"54.0.2840.71"}} -
但session还没保存时,另一个url的请求进来了,这时req.session是没有passport的:
node_modules\passport\lib\middleware\initialize.js中的function initialize(passport):
10/1 09:21:27 [37124] - info: passport initialize url=/vendor/jquery/timeago/locales/jquery.timeago.zh-CN.js?_=1484011286686 req from 127.0.0.1 session={"cookie":{"originalMaxAge":1209599999,"expires":"2017-01-24T01:21:27.070Z","httpOnly":true,"domain":".mydomain.cn","path":"/"},"csrfSecret":"SgW2ayatX0nQMhvStH_jan2T"}
-
login保存session:
node_modules\express-session\index.js中的req.session.save(function onsave(err)) :
10/1 09:21:27 [37124] - info: express-session session.save onsave url=/login {"cookie":{"originalMaxAge":1209600000,"expires":"2017-01-24T01:21:27.148Z","httpOnly":true,"domain":".mydomain.cn","path":"/"},"csrfSecret":"SgW2ayatX0nQMhvStH_jan2T","passport":{"user":6},"meta":{"ip":"127.0.0.1","uuid":"42cea1ef-2f58-417f-a31e-c9fb8cb8f8d6","datetime":1484011287135,"platform":"Microsoft Windows","browser":"Chrome","version":"54.0.2840.71"}} err=null -
url=/vendor/jquery/timeago/locales/jquery.timeago.zh-CN.js?=1484011286686 保存session:
node_modules\express-session\index.js中的req.session.save(function onsave(err)) :
10/1 09:21:27 [37124] - info: express-session session.save onsave url=/vendor/jquery/timeago/locales/jquery.timeago.zh-CN.js?=1484011286686 {"cookie":{"originalMaxAge":1209599999,"expires":"2017-01-24T01:21:27.143Z","httpOnly":true,"domain":".mydomain.cn","path":"/"},"csrfSecret":"SgW2ayatX0nQMhvStH_jan2T"} err=null
导致了login产生的passport被覆盖,登录不成功。
关闭自定义的sso,用nodebb自带的登录界面,则不会出现这样交叉的情况。没想清楚原因。请版主指点指点:)