如何使用Node.js/Express + Passport + Websockets进行身份验证?

9
我正在构建一个angular2-login-seed,使用Passport.js和OAuth策略进行身份验证。显然,这些工具的默认身份验证方法是使用由express签名的HTTP cookie。据我所知,Passport管理实际的Set Cookie标头,以便express可以通过request.isAuthenticated()验证每个后续请求,并通过req.session.passport.dataHere访问由passport设置的数据。
我希望通过Websockets在应用程序中合并实时数据。当然,这意味着从服务器到客户端的套接字流。此通信与常规HTTP服务器请求完全分开,这意味着:
  1. 它不包含所有HTTP请求都包含的HTTP cookie

  2. Express不会代理与套接字的交互,而是由后端使用的任何实现来管理(sock.js、socket.io)

这使得在HTTP请求到express和websocket数据到后端之间简化身份验证变得困难,因为它们是不同的通信方法。

根据我的研究,我有两个选项。其中之一是使用来使我的套接字实现(最好使用sock.js而不是socket.io,但我需要做更多的研究)能够访问express会话。然后我可以按照自己的方式对套接字连接进行身份验证。问题是我不知道如何从前端将express cookie放入流中,因为javascript无法访问它(HTTP only cookie)。

另一个常见的解决方案是使用JWT(JSON Web Tokens)。围绕此实现的实现将JWT存储在前端的localstorage中。这样SPA(在我的情况下是Angular2服务)可以通过每个请求发送它以进行“无状态”服务器身份验证,并且我们还可以通过websocket发送它以验证websocket连接(前端JS显然可以访问localstorage)。考虑此实现时会想到一些事情:

  1. 是否有可能使用JWT代替常规会话信息来使用Passport OAuth策略?这需要做出什么修改?据我所知,Passport策略使用某种OAuth1或OAuth2父策略进行身份验证,默认使用cookie。

  2. 将此重要信息存储在localstorage中是否会使应用程序容易受到安全漏洞(XSS、CSRF等)的攻击?

  3. 如果是这样,我见过最常见的解决方法是将JWT存储在cookie中,以便更难以访问、欺骗或伪造。然而,这让我回到了使用JWT之前的位置,所以没必要费事。

  4. 这是否意味着我必须在后端使用某种状态管理存储(例如Redis)来管理JWT主体的身份验证和解码?(我对Redis等一无所知)。

连接服务器HTTP请求和套接字数据的身份验证概念似乎很奇怪,但对于正确验证套接字连接似乎至关重要。我有点惊讶没有更简单的方法存在。我已经做了一些研究,看到了类似socketio-jwtexpress-jwt等内容,但我不知道这是否可以与我的Passport策略进行管理过渡,或者是否更容易将express会话数据开放给套接字实现,或者我是否完全错误地处理了它!任何帮助或指导将不胜感激,谢谢。
1个回答

0
然后我可以按照自己的方式验证套接字连接。问题是,我不知道如何从前端将express cookie传递到流中,因为JavaScript无法访问它(仅限HTTP cookie)。
使用{{link1:express-socket.io-session}},会话认证在握手时完成,而握手是一个HTTP请求,因此即使您的cookie是仅限HTTP的,也会起作用。(由我亲自测试)

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