停用 csrf 时如何在 Rails 后端保留用户会话

问题描述 投票:0回答:1

我正在迁移应用程序 React + RoR 的前部。

我已经分离了一个 React 组件,并将其部署到 vercel 主机中,用 Next.js 将其包装起来,现在我使用 vercel 重写来访问我在 Heroku 中的应用程序的先前部分,并使用 gem react-导轨。

我在原始站点中使用带有相对路由的axios,所以当我通过vercel重写访问时,我发现调用的路径是相对于vercel中的路由,所以我想通过在所有站点中使用绝对路由来更改这些路径,这提示 CSRF 令牌错误,这导致我在所有控制器中停用它们。现在 current_user Rails 方法,每当从任何这些调用访问它时都是 nil,所以我不知道如何保留用户会话......而不使用 jwt,并维护我拥有的代码。可以吗?

reactjs ruby-on-rails next.js csrf vercel
1个回答
0
投票

看,停用 CSRF 似乎不是一个好主意(出于安全原因)。这就是我在寻找遮阳篷时学到的。

要维护用户会话并处理“Vercel 上的 Next.js 前端”和“Heroku 上的 Rails 后端”之间的“CSRF 令牌”,请按照以下步骤操作:

  1. 在 Rails 应用程序(Rails 控制器)中创建一个端点以返回 CSRF 令牌。

    定义csrf_token 渲染 json: { csrf_token: form_authenticity_token } 结束

  2. 将令牌存储在您的 React 应用程序中,并在 Axios 请求中包含 CSRF 令牌:

    从 'axios' 导入 axios;

    const csrfToken = // 获取并存储 CSRF 令牌

    常量实例 = axios.create({ 标题:{ “X-CSRF-令牌”:csrfToken } });

    axios.defaults.withCredentials = true; // 确保 cookie 与请求一起发送

    导出默认实例;

  3. 将 Rails 后端配置为接受跨源请求并发送 cookie(在 config/application.rb 或初始化程序中)。

    Rails.application.config.middleware.insert_before 0,Rack::Cors 做 允许做 起源“your-nextjs-domain.vercel.app” 资源“*”, 标题::任何, 方法: [:get, :post, :put, :patch, :delete, :options, :head], 凭证:真实 结尾 结束

  4. 在 Axios 请求中使用绝对路由以防止相对路径问题。

    const apiUrl = 'https://your-rails-app.herokuapp.com';

    axios.get(

    ${apiUrl}/your-endpoint
    ) .then(响应=> { // 处理响应 }) .catch(错误=> { // 处理错误 });

  5. 确保 Rails 设置为处理跨域请求的会话和 CSRF 令牌(在您的应用程序控制器中)。

    应用程序控制器类< ActionController::Base protect_from_forgery with: :exception

    在_action之前:set_csrf_cookie

    私人

    def set_csrf_cookie cookies['CSRF-TOKEN'] = form_authenticity_token 如果 protected_against_forgery? 结尾 结束

通过执行这些步骤,您可能可以维护用户会话并正确处理 CSRF 令牌,而无需切换到 JWT。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.