Node.js 与NodeJ一起使用时保护远程资源

Node.js 与NodeJ一起使用时保护远程资源,node.js,Node.js,这更像是一个涉及nodejs实现的架构问题 我有一个文件夹,该文件夹没有被我想提供给用户的Web服务器文件公开 NodeJ向最终用户公开资源的方式是通过一个一次性链接,该链接一旦被使用就不再可用。 通过整个体验,用户永远不会知道文件的真实位置 我确信这是一种常见的架构模式,但我从未实现过类似的东西。 从可伸缩性来看,资源不应该在HD或RAM上复制,如果可能的话,解决方案不应该在DB令牌跟踪系统上中继 我不需要代码实现,但需要一个关于如何实现它的详细说明 非常感谢避免依赖数据库的一种方法是在文件系

这更像是一个涉及nodejs实现的架构问题

我有一个文件夹,该文件夹没有被我想提供给用户的Web服务器文件公开

NodeJ向最终用户公开资源的方式是通过一个一次性链接,该链接一旦被使用就不再可用。 通过整个体验,用户永远不会知道文件的真实位置

我确信这是一种常见的架构模式,但我从未实现过类似的东西。 从可伸缩性来看,资源不应该在HD或RAM上复制,如果可能的话,解决方案不应该在DB令牌跟踪系统上中继

我不需要代码实现,但需要一个关于如何实现它的详细说明


非常感谢

避免依赖数据库的一种方法是在文件系统中创建一个符号链接(基于令牌),该链接将在请求后删除。但在windows上无法令人满意地工作

示例(psuedo):

  • 创建令牌(guid或类似)
  • 符号链接guid->实际文件
  • 请求完成后,删除符号链接
但是,我认为没有可靠的方法可以知道文件是否已成功下载,因此您最好做好准备。当文件完全下载时进行某种类型的pingback可能是我现在能想到的最可靠的方式

为实现可扩展性,请确保符号链接位于共享文件系统上。不过,相同服务器上的Clustered node.js实例也可以

如果需要将其限制为经过身份验证的用户,则可以将guid与身份验证令牌相结合,并在查找文件之前对其进行前置/追加

  • 给用户一个cookie
  • 在cookie和为用户生成的ID之间创建临时关联(以db为单位)(或者,如果您愿意,可以创建它的哈希)
  • 为用户提供ID
当用户按ID请求资源时:

  • 测试以查看ID(或者它的散列,如果你想看的话)是否在数据库中
  • 如果是,则为用户提供资源并销毁用户与资源ID之间的关联

有一个db令牌跟踪系统。嘿,这是唯一的办法。

某种你必须保存的令牌。好的,我的用户都有Json Web令牌。我们能用它做点什么吗?在最坏的情况下,我可以使用数据库,只是想让它更轻的Ram/HD拷贝,我的意思是在服务器端。让我们假设我拥有分区D:/中的所有资源,并且Web服务器正在E:/的子文件夹上运行。我不希望复制web服务器文件夹中的文件,或者需要使用ram作为解决方案(即:使用web流协议)哦,那么您希望将其存储在哪里?我想知道是否有正确目标的别名可以将真实目标隐藏给最终用户。@Snick您可以将http请求路由到该文件。文件路径和http请求路径不需要匹配。如何从nodejs请求发回指向Web服务器外部文件的路径?示例:/datastore是数据存储,/webserver是webserver。如何将请求localhost/1.file解析为物理文件/datastore/1.file?取决于您是否希望以静态方式提供服务。您可以只在/webserver文件夹中创建符号链接,也可以通过文件读取器路由请求并通过管道发送。如果您想添加一个额外的身份验证检查,您必须自己路由它,类似于:/download/guid.file->检查{usertoken}-{guid}.file是否作为符号链接存在(在指定的文件夹中),然后读取{usertoken}-{guid}.file并将其传送到输出流。完成后,删除符号链接。我很快实现了管道解决方案。不幸的是,我不能100%确定在呼叫管道时引擎盖下发生了什么。这是一种记忆技巧吗?这只是一个参考?当指向一个100mb的文件时,它是一个可伸缩的解决方案吗?@Snick据我所知,它应该是好的。它基本上只是两个流之间的转发,它将以接收流允许的最大速率读取。除非接收流具有无限缓冲区,否则您不应该浪费超过中间缓冲区的资源。