使用Passport进行令牌认证,如果令牌失败则使用会话认证。

4
我正在将一个已有的基于NodeJS + Express后端的Web应用适配为PhoneGap / Steroids应用。目前,Web应用的身份验证是由使用会话的Passport(http://passportjs.org/)处理的。
app.use( passport.initialize() );
app.use( passport.session() );

在浏览器中运行良好。不幸的是,在PhoneGap中似乎无法使用会话cookie。因此,发送到服务器的请求将被拒绝。
PhoneGap的推荐解决方案是改用令牌策略,即在每个请求到达服务器时都包含一个唯一的令牌,就像api端点一样。
因此,我想知道以下内容:
是否可以调整passport.session(),以便如果找不到会话cookie,则检查req.token并对其进行授权?
我注意到Passport已经有一些基于令牌的策略可用。(例如https://www.npmjs.org/package/passport-http-bearer) 但是,所有这些策略似乎都假设不会使用会话,并且已关闭。我真正需要的是同时使用两者,因此如果一个身份验证失败(例如会话),它可以跳过并针对另一个身份验证(令牌)进行检查。
是否有人实现了类似于此的功能?任何建议/指针都将不胜感激。
1个回答

1
这几乎是导致我们编写 JSON Web Token 会话中间件模块的完全相同的用例。如果您正在使用 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的功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接