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

Dom*_*ino 7 sockets cookies node.js express passport.js

我正在构建一个angular2-login-seed,它使用Passport.js和OAuth策略进行身份验证.显然,使用这些工具进行身份验证的默认方法是使用由express签名的HTTP cookie.从我所知道的,Passport管理实际的Set Cookie标题,以便express可以request.isAuthenticated()通过护照通过身份验证每个后续请求并访问数据集req.session.passport.dataHere.

我想通过websockets将实时数据合并到应用程序中.这当然意味着从服务器到客户端的套接字流.此通信完全独立于常规HTTP服务器请求,这意味着:

  1. 它不包含所有HTTP请求包含的HTTP cookie

  2. Express不会代理与套接字的交互,它使用后端中使用的任何实现进行管理(sock.js,socket.io)

这使得难以简化要表达的HTTP请求之间的身份验证,并且将websocket数据简化为后端,因为它们是单独的通信方法.

根据我的研究,这给我留下了两个选择.其中一个是使用来实现我的套接字实现(最好通过socket.io上的sock.js,但我需要做更多的研究)访问快速会话.然后我可以根据需要验证套接字连接.问题是我不知道如何将快速cookie从前面获取到流中,因为javascript无法访问它(仅HTTP cookie).

我见过人们跳过的另一个常见解决方案是使用JWT(JSON Web令牌).围绕此实现的实现将JWT存储在前端的localstorage中.这是SPA(在我的案例中Angular2服务)可以发送它与每个"无状态"服务器身份验证请求,我们可以通过websocket发送它来验证websocket连接(前端JS显然可以访问本地存储) .在考虑这种实现时会想到几件事:

  1. 是否有可能让Passport OAuth策略使用JWT而不是常规会话信息?这会带来什么样的改变?据我所知,Passport策略使用某种形式的OAuth1或OAuth2父策略进行身份验证,默认使用cookie.

  2. 将此重要信息存储在本地存储中会将应用程序打开以防止安全漏洞(XSS,CSRF等)

  3. 如果是这样,我见过的最常见的解决方法是将JWT存储在cookie中,这样就不会轻易访问,欺骗或伪造.然而,这让我回到了使用JWT之前的位置,所以不妨打扰.

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

在服务器HTTP请求和套接字数据之间连接身份验证的想法很奇怪,但对正确验证套接字连接似乎至关重要.我有点惊讶一个不存在的简单方法.我已经做了一些研究并且已经看过诸如socketio-jwt,express-jwt之类的东西,但是我不知道这是否可以通过我的Passport策略进行可管理的转换,或者是否更容易打开快速会话数据到套接字实现,或者如果我说错了!

非常感谢任何帮助或指导.

小智 0

然后我可以根据需要验证套接字连接。问题是我不知道如何从前面将 Express cookie 放入流中,因为 javascript 无法访问它(仅 HTTP cookie)。

使用express-socket.io-session,会话身份验证是在握手时完成的,并且握手是一个http请求,因此即使您的cookie是http-only的,它也可以工作。(本人测试过)