2014-09-05 233 views
2

我正致力于将具有NodeJS + Express后端的现有Web应用程序调整为PhoneGap/Steroids应用程序。目前,Webapp的身份验证由Passport(http://passportjs.org/)使用会话处理。通过令牌进行身份验证,然后通过会话验证令牌是否失败,使用Passport?

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

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

为PhoneGap的建议的解决方案是替代,其中唯一的令牌被包括使用一个令牌策略与每一个请求给服务器,如在API端点。

所以,这里是我想知道:

是否有可能适应passport.session(),这样,如果没有会话cookie被发现,它反而会检查是否有req.token和授权对吗?

我注意到,已经有可用护照某些基于令牌的策略。 (例如https://www.npmjs.org/package/passport-http-bearer)但是,所有这些策略似乎都假设会话不会被使用,并且被关闭。我真正需要的是使用两者,所以如果一次认证失败(例如会话),它可以通过并检查另一个认证(令牌)。

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

回答

1

这几乎正是导致我们写一个JSON网络令牌会话中间件模块相同的使用情况。如果你使用Redis,它应该很好地适合你的堆栈。

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

如果更改requestKey初始化参数,以类似“jwtSession”,而不是“会话”,您可以在保留现有基于cookie的会话中间件运行这个中间件。然后,在您的路线中,您可以检查req.session.whatever或req.jwtSession.whatever并处理独立于Cookie/JWT传输机制的更高级别的功能。

您可能需要修改您的护照策略和/或序列化/反序列化功能,但它不应该太多的工作这个中间件合并到现有护照基础的应用。

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

无论哪种方式,你要寻找的不是一个随机生成的UUID,而是一个加密令牌,如智威汤逊,只包含足够的会话标识数据来代替饼干的功能。

相关问题