gpt4 book ai didi

node.js - 注销并获取 new/csrfToken 后 SailsJS CSRF 不匹配

转载 作者:太空宇宙 更新时间:2023-11-03 23:35:38 30 4
gpt4 key购买 nike

我正在创建单页应用程序。我已经创建了登录-注销操作,并且它们工作正常。但是,如果用户注销并且不会在浏览器中刷新页面,则由于“CSRF 不匹配”错误,他无法再次登录。

步骤:

1.在第一个页面加载时,csrf是本地 View :

<div class="app" id="app" data-csrf="<%= _csrf %>"></div>

2.用户使用此 token 成功登录:

420["post",{"method":"post","headers":{},"data":{"_csrf":"VHcT2F44-KhZMJmhcAVB1H69BgTMWMZji9_8","login":"alex","password":"123"},"url":"http://127.0.0.1:1337/login"}]
430[{"body":{"id":"560e5756cd01633407eea8be"},"headers":{cut headers},"statusCode":200}]

3.然后,用户使用此 token 注销:

421["post",{"method":"post","headers":{},"data":{"_csrf":"VHcT2F44-KhZMJmhcAVB1H69BgTMWMZji9_8"},"url":"http://127.0.0.1:1337/logout"}]
431[{"body":"ok","headers":{cut headers},"statusCode":200}]

4.如果他尝试再次登录,他将捕获“CSRF 不匹配”错误,我预计会出现这种情况:

422["post",{"method":"post","headers":{},"data":{"_csrf":"VHcT2F44-KhZMJmhcAVB1H69BgTMWMZji9_8","login":"alex","password":"123"},"url":"http://127.0.0.1:1337/login"}]
432[{"body":"CSRF mismatch","headers":{},"statusCode":403}]

5.我正在捕获此错误并按照 docs 中所述执行/csrfToken 请求

423["get",{"method":"get","headers":{},"data":{},"url":"/csrfToken"}]
433[{"body":{"_csrf":"49C5OVUZ-6SIL_zW3g1NGI87ux6Mlp-UJj_w"},"headers":{cut headers},"statusCode":200}]

6.尝试使用新 token 再次登录:

424["post",{"method":"post","headers":{},"data":{"_csrf":"49C5OVUZ-6SIL_zW3g1NGI87ux6Mlp-UJj_w","login":"alex","password":"123"},"url":"http://127.0.0.1:1337/login"}]
434[{"body":"CSRF mismatch","headers":{},"statusCode":403}]

我可以重复步骤 5 和 6,得到相同的结果。

如果我刷新页面,我就可以正常登录。问题是,发生了什么事?为什么第 6 步中的 token 不匹配?

编辑:注销方法:

req.session.destroy();
return res.send("ok");

编辑2:发送请求:

import socketIOClient from 'socket.io-client';
import sailsIOClient from 'sails.io.js';
var io = sailsIOClient(socketIOClient);

io.socket.post(form.action, serialize(form, {hash: true}), function (data, jwres){
...
});

最佳答案

TL;DR:如果您通过套接字执行所有操作,请使用 req.session.csrfSecret = null 而不是 req.session.destroy()

<小时/>这里的问题在于 Express sessions 的工作方式。当您对其中一个调用 .destroy() 时,它会删除 Express MemoryStore 维护的 sessions 对象中当前 session ID (SID) 的条目。通常情况下这很好,因为它将在下一个请求时重新生成,但这只是运行所有 Express 中间件的下一个请求 - 而对 Sails 应用程序的 Socket 请求不会这样做,因为 anyone trying to use Passport with Sails out-of-the-box 会告诉您。因此,下次您发出套接字请求(以生成新的 CSRF key 并获取新 token )时,您实际上并未连接到 session ,并且不会保存新信息。

如果您不销毁整个 session ,而只是销毁用于生成 CSRF token 的 csrfSecret,那么下一个套接字请求仍将附加到 session ,并且新的 key 将被保存。您还需要清空任何其他使用户保持登录状态的 session 变量。

关于node.js - 注销并获取 new/csrfToken 后 SailsJS CSRF 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32907860/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com