SailsJS处于生产模式,API路由提供了禁止的错误

时间:2019-06-24 07:02:08

标签: sails.js

有时会在Sails Web应用程序上工作。

到目前为止,通过认真阅读,反复试验可以克服所有问题。

最近不得不在客户端的ec2免费试用版实例上安装该应用程序进行封闭Beta测试,该实例在开发模式下正常运行。

该应用程序位于nginx代理后面,该代理监听80端口并重定向到http://server_IP:1337

启用了CORS和CSRF,将allowOrigins和onlyAllowOrigins设置为production.js,security.js和sockets.js中的服务器IP,Web域和本地主机。

但是,当切换到生产模式时,除GET之外的所有API请求都禁止403。

尝试了我在Google上可以找到的所有内容,它根本无法在生产环境中使用,但完全可以在开发环境中使用。

如果有人可以分享一点看法,将不胜感激。

编辑:

以愚蠢的调试方式运行应用程序,显示如下:

  

允许套接字连接,但无法加载会话。创建一个空的一次性会话以用于此套接字连接的整个生命周期。   通常会显示此日志,因为来自先前升降机或其他Sails应用程序的客户端套接字正在尝试重新连接(例如,从打开的浏览器选项卡),但其cookie所指示的会话不再存在-因为该应用程序当前未使用持久性会话存储(如Redis),或会话条目已从会话存储中删除(例如,通过计划的作业或因为它自然过期)。   细节:    错误:无法加载会话。       在InstantImmediate(internal / timers.js:445:19)上的Instant._onImmediate(/var/www/allscubashops.com/node_modules/sails/lib/hooks/session/index.js:543:42)

然后,我删除了旧的浏览器cookie,并得到了它:

  

由于连接套接字的握手中没有cookie,因此无法获取会话。   生成了一次使用的cookie:   sails.sid = s%3APlHbdXvOZRo5yNlKPdFKkaPgVTNaNN8i.DwZzwHPhb1%2Fs9Am49lRxRTFjRqUzGO8UN90uC7rlLHH   并将其保存在套接字握手中。

     

这意味着套接字从一个空会话开始,即(req.session === {})   该“匿名”会话将仅持续到套接字断开连接为止。要解决此问题,   确保套接字在最初连接时发送cookie头或查询参数。   (这通常是由于使用非浏览器客户端(例如本机iOS / Android应用,   React Native,Node.js脚本或其他连接的设备。当   尝试在浏览器中连接跨域套接字,特别是对于Safari用户。   要解决此问题,请手动提供Cookie,或忽略此消息并使用   除会议外的其他方法-例如身份验证令牌。)

也未设置新的Cookie。

一个明显的结论是,在生产模式下以某种方式设置会话是错误的。

编辑2:

最新发现是,如果我在不使用nginx代理的情况下运行该应用程序,则不会出现禁止的API请求问题,但是仍然存在与未创建会话相关的问题。

我确定Nginx代理的设置是可以的,但是现在我正在考虑实现Redis方式来存储会话,而不是默认的内存并查看会发生什么情况

编辑3:

我已经实现了Redis会话,该会话同时适用于开发和生产模式。

在相同情况下,不具有nginx代理的ec2实例在生产模式下工作,而具有nginx代理的ec2实例上的相同文件(git复制)在生产模式下不工作(禁止API请求403),但在开发中效果很好模式。

已发送X-CSRF令牌screenshot 我在生产中收到的Sails错误消息(除了GET之外,所有请求的网络403禁止错误)是:

  

允许套接字连接,但无法加载会话。创建一个空的一次性会话以用于此套接字连接的整个生命周期。   通常会显示此日志,因为来自先前升降机或其他Sails应用程序的客户端套接字正在尝试重新连接(例如,从打开的浏览器选项卡),但其cookie所指示的会话不再存在-因为该应用程序当前未使用持久性会话存储(如Redis),或会话条目已从会话存储中删除(例如,通过计划的作业或因为它自然过期)。   细节:    错误:无法加载会话。       在/var/www/example.com/node_modules/sails/lib/hooks/session/index.js:543:42       在Command.callback(/var/www/example.com/node_modules/@sailshq/connect-redis/lib/connect-redis.js:148:25)       在normal_reply(/var/www/example.com/node_modules/machinepack-redis/node_modules/redis/index.js:714:21)       在RedisClient.return_reply(/var/www/example.com/node_modules/machinepack-redis/node_modules/redis/index.js:816:9)       在JavascriptRedisParser.returnReply(/var/www/example.com/node_modules/machinepack-redis/node_modules/redis/index.js:188:18)       在JavascriptRedisParser.execute(/var/www/example.com/node_modules/redis-parser/lib/parser.js:574:12)       在套接字。 (/var/www/example.com/node_modules/machinepack-redis/node_modules/redis/index.js:267:27)       在Socket.emit(events.js:193:13)       在addChunk(_stream_visible.js:296:12)       在可读AddChunk(_stream_visible.js:277:11)       在Socket.Readable.push(_stream_visible.js:232:10)       在TCP.onStreamRead(internal / stream_base_commons.js:150:17)

因此,我假定套接字已连接,但未创建会话。

Redis正常工作,在开发过程中我会看到其中的会话。

1 个答案:

答案 0 :(得分:1)

您是否公开了csrf端点,并且在发出进一步请求之前是否先调用该端点以获取令牌?这给了我一次提示。