我正在使用 ExpressJS、Mongodb(Mogoose) 构建一个应用程序。应用程序包含用户在访问它之前必须经过身份验证的路由。
目前我已经编写了一个快速中间件来做同样的事情。在这里,借助 JWT token ,我进行 mongodb 查询以检查用户是否经过身份验证。但觉得这可能会给我的数据库带来不必要的请求负载。
should I integrate redis for this specific task?
does it will improve API performance? or should go ahead with existing mongodb approach?
如果我对此有更多见解会有所帮助。
最佳答案
TLDR:如果您希望能够在某个时候撤销 token ,是的,将其存储在 Redis 之类的快速设备中。
使用 JWT 的一个有据可查的缺点是,例如,如果用户需要注销或 token 已被泄露,则没有简单的方法来撤销 token 。撤销 token 意味着在一些存储中查找它,然后决定下一步做什么。由于 JWT 的要点之一是避免往返于 db,因此一个很好的折衷方案是将其存储在比 rdbms 更少负担的东西中。这对 Redis 来说是一项完美的工作。
正如评论中所建议的,一个好的方法是将列表设为黑名单(即无效 token 列表)。在每次请求时,您都会查找列表以确保 token 不存在于其中。通过使用概率算法存储 token ,您可以在查找步骤中进一步提高内存空间和性能。一种简单的方法是进行分层查找。例如,您可以有一个小型应用内商店,它只跟踪您列入黑名单的 token 的前几个(例如 1 到 4)字节。然后,redis 缓存将跟踪相同 token 的稍微更完整的版本(例如,前 2 到 8 个字节)。然后,您可以使用更持久的解决方案(文件系统、rdbms 等)存储列入黑名单的 token 的完整版本。这是一种乐观的查找策略,可以快速确认黑名单中不存在某个 token (这将是更常见的情况)。如果正在查找的 token 恰好与应用内黑名单中的项目匹配(因为它的前几个字节匹配),则继续在 redis 存储上进行额外的查找,然后在需要时进行持久存储。部分(或全部)存储可以实现为 tries或哈希表。另一个要考虑的有效且相对简单的实现数据结构是称为 Bloom filter 的数据结构。 .
显然,如果您经常将数百万个持久 token 列入黑名单(这也可能表明您有不同的问题),则必须采用上述方法。
关于node.js - 我应该将 JWT token 存储在 redis 中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44890564/
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.
使用rspec-rails3.0+,测试设置分为spec_helper和rails_helper我注意到生成的spec_helper不需要'rspec/rails'。这会导致zeus崩溃:spec_helper.rb:5:in`':undefinedmethod`configure'forRSpec:Module(NoMethodError)对thisissue最常见的回应是需要'rspec/rails'。但这是否会破坏仅使用spec_helper拆分rails规范和PORO规范的全部目的?或者这无关紧要,因为Zeus无论如何都会预加载Rails?我应该在我的spec_helper中做
我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我正在关注Hartl的railstutorial.org并已到达11.4.4:Imageuploadinproduction.我做了什么:注册亚马逊网络服务在AmazonIdentityandAccessManagement中,我创建了一个用户。用户创建成功。在AmazonS3中,我创建了一个新存储桶。设置新存储桶的权限:权限:本教程指示“授予上一步创建的用户读写权限”。但是,在存储桶的“权限”下,未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字+数字创建的用户名之间进行选择。我已经通过选择经过身份验证的用户并选中了上传/删除和查看权限的框(而不