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

标签 node.js sockets express cookies passport.js

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

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

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

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

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

根据我的研究,我有两个选择。其中之一是使用 library让我的套接字实现(最好是 sock.js 而不是 socket.io,但我需要做更多研究)访问快速 session 。然后我可以根据需要验证套接字连接。问题是我不知道如何从前端将 express cookie 放入流中,因为 javascript 无法访问它(仅限 HTTP cookie)。

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

  1. 是否有可能让 Passport OAuth 策略使用 JWT 而不是常规 session 信息?这需要进行哪些修改?据我所知,Passport 策略使用某种形式的 OAuth1 或 OAuth2 父策略进行身份验证,默认使用 cookie。

  2. 将这些重要信息存储在本地存储中会使应用程序面临安全漏洞(XSS、CSRF 等)

  3. 如果是这样,我见过的最常见的解决方法是将 JWT 存储在 cookie 中,这样它就不会那么容易被访问、欺骗或伪造。然而,这让我回到了使用 JWT 之前的状态,所以最好不要打扰。

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

在服务器 HTTP 请求和套接字数据之间进行连接验证的想法很奇怪,但对于正确验证套接字连接似乎至关重要。我有点惊讶不存在更简单的方法。我做了一些研究,看到了诸如 socketio-jwt 之类的东西。 , express-jwt等等,但是我不知道这是否是我的 Passport 策略的可管理转换,或者是否更容易将快速 session 数据打开到套接字实现,或者我是否正在做这一切都是错误的!

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

最佳答案

Then I could authenticate the socket connection however I want. Issue is I have no idea how I would get the express cookie into the stream from the front since javascript cannot access it (HTTP only cookie).

express-socket.io-session session 验证是在握手时完成的,握手是一个 http 请求,所以即使你的 cookie 是 http-only 它也会工作。 (本人测试)

关于node.js - 如何使用 Node.js/Express + Passport + Websockets 进行身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36783053/

相关文章:

linux - 使用 npm 安装后找不到命令

javascript - pm2 在集群模式下弃用了 worker

javascript - Node.js 停止播放音频

java - 更改客户端-服务器应用程序中圆圈的颜色

node.js - 无法使用 NodeJS (ExpressJS) 解析 XML 以进入 MongoDB

javascript - 如何在循环中对一堆查询进行排序?

python - 调用句柄后调用recv挂起

java - 套接字传输的文件: contents are empty

javascript - 如何让网页游戏在同一 URL 上运行?

javascript - 在执行后续步骤之前返回异步的 Sequelize 结果