在redux存储中添加CSRF令牌是一种好的做法吗



在redux中存储CSRF令牌是一种好的做法吗?我之前用道具传递它(将其添加到Axios头文件中(。我有一个rails后端,我使用的是gemreact-rails,我的组件是服务器渲染的,所以我没有想出任何其他方法,只是将CSRF令牌传递给组件。

将令牌存储在Redux存储中是可以的。

令牌的目的是防止其他站点/来源向您的API发出非GET(POST、PUT、DELETE(请求。如果没有它,恶意网站可能会发出请求,并利用您浏览器中存储的cookie和会话。在一个纯HTML服务器渲染的Rails应用程序中,这个令牌被直接放入HTML中,使该页面上的任何JavaScript都可以使用它。因此,对于您控制的页面上的任何代码来说,这都不是私人信息。

尽管如此,考虑到它的全局性,并且您可能在Redux的上下文之外需要它,最好将它放在window上供任何人使用:

window.CSRF_TOKEN = document.querySelector("meta[name='csrf-token']").getAttribute("content")

任何时候调用fetch,都可以包含以下标题:

headers: {
'X-CSRF-Token': window.CSRF_TOKEN
}

由于您使用的是react-rails,您也可以将其作为道具传递给您的组件:

react_component 'MyForm', authenticity_token: form_authenticity_token

如果您不依赖Rails会话进行身份验证(例如,使用Bearer令牌(,您也可以在ApplicationController:中使用此行完全禁用CSRF令牌

protect_from_forgery with: :null_session

最新更新