通过令牌validation,然后通过会话,如果令牌失败,使用护照?

我正致力于将现有的Web应用程序与NodeJS + Express后端适配到PhoneGap / Steroids应用程序。 当前Web应用程序的身份validation由Passport( http://passportjs.org/ )使用会话进行处理。

app.use( passport.initialize() ); app.use( passport.session() ); 

在浏览器中很好用。 不幸的是,会话cookie在PhoneGap中不起作用。 所以发送到服务器的请求只会被拒绝。

PhoneGap的推荐解决scheme是使用令牌策略,而每个向服务器的请求中都包含一个唯一令牌,就像一个API端点一样。

所以,这是我想知道的:

是否有可能适应passport.session(),所以如果没有会话cookie被发现,它会改为检查一个req.token和授权反对呢?

我注意到已经有一些基于令牌的Passport策略可用。 (例如https://www.npmjs.org/package/passport-http-bearer )然而,所有这些策略似乎都假设会话将不会被使用,并被closures。 我真正需要的是使用两者,所以如果一个身份validation失败(例如会话),它可以通过并检查另一个身份validation(令牌)。

有没有人按照这个方法实现了一些东西? 任何build议/指针,将不胜感激。

这几乎是完全相同的用例,导致我们编写JSON Web Token会话中间件模块。 如果你使用Redis,它应该很好地适合你的堆栈。

https://www.npmjs.org/package/jwt-redis-session

如果将requestKey初始化参数更改为“jwtSession”而不是“session”,则可以将此中间件与现有的基于Cookie的会话中间件一起运行。 然后在你的路线中,你可以检查req.session.whatever或者req.jwtSession.whatever,并且独立于cookie / JWT传输机制来处理更高级别的function。

您可能需要修改您的护照策略和/或序列化/反序列化function,但将此中间件合并到现有的基于护照的应用程序中应该不会太多工作。

无论您是否想使用该模块,我认为您应该考虑使用基于JSON Web令牌的东西。 当用户authentication你的服务器时,他们将令牌发送回phonegap应用程序,然后在每个后续的请求中发送令牌。 在这里,JWT将简单地通过cookie取代function浏览器的支持。 通过JWT来pipe理会话过期可能有点棘手,因为到期被烘焙到声明中,因此无法在不重新生成新令牌的情况下“刷新”会话的TTL。 这导致我们退回到redispipe理到期。

无论哪种方式你正在寻找的不是一个随机生成的UUID,而是一个encryption的令牌,如JWT,只包含足够的会话标识数据来代替cookies的function。