我正在迁移应用程序 React + RoR 的前部。
我已经分离了一个 React 组件,并将其部署到 vercel 主机中,用 Next.js 将其包装起来,现在我使用 vercel 重写来访问我在 Heroku 中的应用程序的先前部分,并使用 gem react-导轨。
我在原始站点中使用带有相对路由的axios,所以当我通过vercel重写访问时,我发现调用的路径是相对于vercel中的路由,所以我想通过在所有站点中使用绝对路由来更改这些路径,这提示 CSRF 令牌错误,这导致我在所有控制器中停用它们。现在 current_user Rails 方法,每当从任何这些调用访问它时都是 nil,所以我不知道如何保留用户会话......而不使用 jwt,并维护我拥有的代码。可以吗?
看,停用 CSRF 似乎不是一个好主意(出于安全原因)。这就是我在寻找遮阳篷时学到的。
要维护用户会话并处理“Vercel 上的 Next.js 前端”和“Heroku 上的 Rails 后端”之间的“CSRF 令牌”,请按照以下步骤操作:
在 Rails 应用程序(Rails 控制器)中创建一个端点以返回 CSRF 令牌。
定义csrf_token 渲染 json: { csrf_token: form_authenticity_token } 结束
将令牌存储在您的 React 应用程序中,并在 Axios 请求中包含 CSRF 令牌:
从 'axios' 导入 axios;
const csrfToken = // 获取并存储 CSRF 令牌
常量实例 = axios.create({ 标题:{ “X-CSRF-令牌”:csrfToken } });
axios.defaults.withCredentials = true; // 确保 cookie 与请求一起发送
导出默认实例;
将 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], 凭证:真实 结尾 结束
在 Axios 请求中使用绝对路由以防止相对路径问题。
const apiUrl = 'https://your-rails-app.herokuapp.com';
axios.get(
${apiUrl}/your-endpoint
)
.then(响应=> {
// 处理响应
})
.catch(错误=> {
// 处理错误
});
确保 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。