我正在使用NodeJS + Express后端将现有的Web应用程序调整到PhoneGap / Steroids应用程序。目前,对于webapp的身份验证由Passport(http://passportjs.org/)使用会话进行处理。
app.use( passport.initialize() );
app.use( passport.session() );
在浏览器中运行良好。不幸的是,会话cookie似乎在PhoneGap中不起作用。因此,发送到服务器的请求会被拒绝。
建议的PhoneGap解决方案是使用令牌策略,其中每个请求都包含一个唯一的令牌,如api端点。
所以,这就是我想知道的:
是否可以调整passport.session(),以便在没有找到会话cookie时,它会检查req.token并对其进行授权?
我注意到已经存在一些基于令牌的Passport策略。 (例如https://www.npmjs.org/package/passport-http-bearer)然而,所有这些策略似乎都假定会话将不会被使用,并且会被关闭。我真正需要的是同时使用两者,因此如果一个身份验证失败(例如会话),它可以传递并检查另一个身份验证(令牌)。
有没有人实现过这方面的东西?任何建议/指针将不胜感激。
答案 0 :(得分:1)
这几乎是导致我们编写JSON Web令牌会话中间件模块的用例。如果您正在使用Redis,它应该很适合您的堆栈。
https://www.npmjs.org/package/jwt-redis-session
如果将requestKey初始化参数更改为“jwtSession”而不是“session”,则可以将此中间件与现有的基于cookie的会话中间件一起运行。然后在您的路由中,您可以检查req.session.whatever或req.jwtSession.whatever并处理独立于cookie / JWT传输机制的更高级别功能。
您可能必须修改您的护照策略和/或序列化/反序列化功能,但将此中间件合并到现有的基于护照的应用程序中不应该太多工作。
无论您是否要使用该模块,我认为您应该考虑使用基于JSON Web Tokens的东西。当用户验证您的服务器时,会将其令牌发送回phonegap应用程序,然后该应用程序将在每个后续请求中发送令牌。在这里,JWT将简单地通过cookie替换浏览器支持的功能。通过JWT来管理会话到期可能有点棘手,因为到期时声明已经过期,因此如果不重新生成新令牌,就无法“刷新”会话的TTL。这就是我们回归redis来管理到期的原因。
无论哪种方式,您所寻找的不是随机生成的UUID,而是加密的令牌,例如JWT,它包含足够的会话标识数据来替换cookie的功能。