Node.js Express – 在不同的服务器上共享Passport会话

所以我们有一个“web”服务器和一个API服务器 – web服务器提供HTML,API服务器提供JSON。

我们使用Passport的Twitter策略在Web服务器上进行身份validation。

我的问题是 – 检查API服务器的最佳方法是什么,用Web服务器进行身份validation的用户也使用API​​进行身份validation?

我的假设是,我们应该把大部分Passport代码放到Web服务器上,让用户像往常一样使用Passport进行身份validation,并使用API服务器中的某些中间件来检查用户是否已login(有会话):

app.use(passport.initialize()); app.use(passport.session()); app.use(expressSession({ secret: 'keyboard cat', store: new MongoStore({mongooseConnection: mongoose.connection}) })); app.use(function(req,res,next){ if(req.isAuthenticated()){ next(); } else{ console.log('unauthenticated request'); res.status(403).json({error:'unauthorized request'}); } }); 

但是,上述似乎还不够。 我完全搞不清楚API服务器上需要什么代码 – 我相信我需要从相同的会话存储中读取Web服务器写入的内容,并在API服务器的请求中查看令牌,并将其与会话存储中的令牌?

我不知道我明白了req.isAuthenticated()函数的作用是什么? 好像我现在需要写我自己的req.isAuthenaticated()函数,它会话存储asynchronous读取…

有没有人有一个如何做到这一点的权利?

您可能可以按照您的说法进行操作 – 使用Web服务器进行身份validation,并validation是否使用API​​进行了身份validation。

如果两台服务器共享相同的远程会话存储,并且两个端点都可以访问快速会话cookie,则应该可以为API实现类似以下内容:

 function ensureAuthenticated(req, res, next) { if (req.isAuthenticated()) return next(); else // Not authenticated } 

要么

 if (req.user) { // logged in } else { // not logged in } 

作为中间件(如您在示例中所示)或每个路由 。

如果您不能访问相同的,共享的会话cookie,这可能是不可行的。 其他选项可能可用,具体取决于您的应用程序内置的结构,即。 – 如果Web服务器直接与API通话。

您可以从护照github中读取原始req.isAuthenticated函数。