Rails API ActiveStorage DirectUpload 产生 422 错误 InvalidAuthenticityToken

2024-01-12

我对 Rails API 应用程序主动存储有疑问。我有 React 从我想上传文件的地方。

import React from "react";
import {DirectUpload} from "activestorage";

class SignIn extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      file: null
    };
    this.handleFileChange = this.handleFileChange.bind(this);
    this.handleFileSubmit = this.handleFileSubmit.bind(this);
  }

  handleFileChange(e){
    this.setState({file: e.target.files[0]})
  }

  handleFileSubmit(){
    const upload = new DirectUpload(this.state.file, "/rails/active_storage/direct_uploads");

    upload.create((error, blob) => {
      if(error){
        console.log(error)
      } else {
        console.log(blob)
      }
    })
  }

  render() {

    return (
      <React.Fragment>
          <Form>
          <Form.Item>
            <Input type="file" onChange={this.handleFileChange}/>
          </Form.Item>

          <Form.Item>
            <Button type="primary" htmlType="submit">
              Register
            </Button>
          </Form.Item>
        </Form>
      </React.Fragment>
    );
  }
}

但在提交时我收到错误Completed 422 Unprocessable Entity in 1ms (ActiveRecord: 0.0ms)

Started POST "/rails/active_storage/direct_uploads" for 127.0.0.1 at 2019-05-09 22:59:54 +0200
Processing by ActiveStorage::DirectUploadsController#create as JSON
  Parameters: {"blob"=>{"filename"=>"file.jpg", "content_type"=>"image/jpeg", "byte_size"=>27095, "checksum"=>"8u95dXg39vap1Cq/2fgfbg=="}, "direct_upload"=>{"blob"=>{"filename"=>"file.jpg", "content_type"=>"image/jpeg", "byte_size"=>27095, "checksum"=>"8u95dXg39vap1Cq/2fgfbg=="}}}
Can't verify CSRF token authenticity.
Completed 422 Unprocessable Entity in 1ms (ActiveRecord: 0.0ms)



ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):

actionpack (5.2.3) lib/action_controller/metal/request_forgery_protection.rb:211:in `handle_unverified_request'
actionpack (5.2.3) lib/action_controller/metal/request_forgery_protection.rb:243:in `handle_unverified_request'
devise (4.6.2) lib/devise/controllers/helpers.rb:255:in `handle_unverified_request'
actionpack (5.2.3) lib/action_controller/metal/request_forgery_protection.rb:238:in `verify_authenticity_token'
activesupport (5.2.3) lib/active_support/callbacks.rb:426:in `block in make_lambda'
activesupport (5.2.3) lib/active_support/callbacks.rb:198:in `block (2 levels) in halting'
actionpack (5.2.3) lib/abstract_controller/callbacks.rb:34:in `block (2 levels) in <module:Callbacks>'
activesupport (5.2.3) lib/active_support/callbacks.rb:199:in `block in halting'
activesupport (5.2.3) lib/active_support/callbacks.rb:513:in `block in invoke_before'

我在application_controller.rb中设置protect_from_forgery with: :null_session但我仍然有错误。


我有同样的问题。有两种方法可以解决这个问题:

1.猴子补丁(不推荐)

in config/initializers/direct_uploads.rb :

require 'active_storage/direct_uploads_controller'

class ActiveStorage::DirectUploadsController
  protect_from_forgery with: :null_session
end

2.自定义控制器(推荐)

假设您有 API 端点/api/v1 :

config/routes.rb

namespace :api do
  scope module: 'v1', path: 'v1' do
    resources :direct_uploads, only: [:create]
  end
end

app/controllers/api/v1/direct_uploads_controller.rb

class Api::V1::DirectUploadsController < ActiveStorage::DirectUploadsController
  # Should only allow null_session in API context, so request is JSON format
  protect_from_forgery with: :null_session, if: Proc.new { |c| c.request.format == 'application/json' }

  # Also, since authenticity verification by cookie is disabled, you should implement you own logic :
  before_action :verify_user

  private

  def verify_user
    raise unless User.find(doorkeeper_token[:resource_owner_id])
  end
end

并使用正确的端点更改 DirectUpload 实例:

const upload = new DirectUpload(this.state.file, "/api/v1/direct_uploads");

希望这可以帮助。干杯!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails API ActiveStorage DirectUpload 产生 422 错误 InvalidAuthenticityToken 的相关文章

  • rspec 中的模拟方法链

    有一系列方法可以获得user目的 我试图模拟以下内容以返回user in my Factory Girl current user AuthorizeApiRequest call request headers result 我可以模拟该
  • 再次返回使用 Rails 3 中的 Rails 2.3.5

    最近 我看到有关Rails 3 0 beta的信息 我想尝试一下 所以我使用gem update并安装了这个版本 但现在 我需要回到 Rails 2 3 5 我怎样才能做到呢 我正在考虑这两个解决方案 卸载 Rails 3 我读到有人使用
  • 回形针:样式取决于模型(has_many 多态图像)

    我已将模型设置为使用多态图像模型 这工作正常 但是我想知道是否可以更改每个模型的 styles 设置 找到了一些使用 STI 模型 Art has many images as gt imageable Image belongs to i
  • 在复选框内映射复选框 ReactJS

    我有一个函数 一旦主复选框被选中 就会触发子复选框 并且所有这些复选框都是从 JSON 映射的 主复选框 最高级别 及其下面的所有子复选框 第二级别 都会在单击时显示 并且效果很好 我想要显示的是单击时主复选框 第三级别 的子复选框2 级项
  • db:schema:load 与 db:migrate 使用 capistrano

    我有一个 Rails 应用程序 我正在将其移动到另一台服务器 我认为我应该使用 db schema load 来创建 mysql 数据库 因为这是推荐的 我的问题是我正在使用 capistrano 进行部署 并且它似乎默认为 rake db
  • Rails 中多个模型的最佳实践 - 嵌套/非嵌套和验证

    笔记 根据布莱恩的评论 来自如何以 Rails 形式处理多个模型 https stackoverflow com questions 892624 how to handle multiple models in a rails form
  • 默认:Rails 资源路由的排除选项

    一个小问题 我正在将 Rails 用于 REST API 但由于它是 RESTful API 所以我并不真正需要 new or edit我的任何资源的路由 因为人们只会完全通过自动 JSON 请求而不是图形方式与此 API 交互 例如 不需
  • 使用设计宝石导轨注销用户

    在管理部分 我显示当前登录用户的列表 现在管理员可以选择一个或多个用户并销毁他们的会话 注销他们 我不知道从哪里开始 请帮助我 您可以使用sign out通过传入用户对象在控制器操作中的方法 Make sure only admins ca
  • 创建费用前验证 CVC 代码

    我正在尝试检查用户输入的 cvc 代码 我已经存储了条带 customer id 和条带 card id 我想在向用户收费之前验证 CVC 代码 以下是创建费用的代码 charge Stripe Charge create amount g
  • 如何在 Rails 测试中填充查找表

    我在用Cucumber RSpec and 工厂女工用于测试我的 Rails 应用程序 但我有几个查找表 其中大部分包含static数据 所以我试图找出测试时填充这些的最佳方法 单独做它们FactoryGirl看起来很乏味 我想远离固定装置
  • 通过 Javascript 填充 ReactJS HTML 表单

    我正在开发一个应用程序 在打开第 3 方网站后 我可以在浏览器上下文中运行我自己的 Javascript 作为一个基于reactjs构建并具有登录表单的示例网站 您可以参考此链接 我正在尝试在reactjs生成的表单中填写用户名和密码 但是
  • 何时使用node.js、sinatra、rails? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这 3 种语言 框架的最佳用途是什么 混合所有 或 2 个 有用吗 如果您正在构建一个完整的 Web 应用程序 您可能应该使用 Rails 因为
  • Redux 状态 - 最大推荐大小

    我正在构建一个项目管理应用程序 但我仍然在努力解决一个问题 在 Redux 状态中存储什么以及 按需 加载什么 Redux 状态是否有已知的 最大推荐大小 几十千字节 几百千字节 兆字节单位 请记住 归根结底 Redux 只是 如何 将信息
  • 如何在 Ruby 中创建自定义排序方法

    我想指定一个自定义块方法 通过评估两个属性来对对象数组进行排序 然而 经过多次搜索 我没有找到任何没有的例子 lt gt 操作员 我想比较a to b if a x less than b x return 1 if a x greater
  • 在 postgresql 中查找和汇总具有重叠记录的日期范围

    我有一个大型数据集 我想对记录具有重叠时间的计数进行求和 例如 给定数据 id 1 name A start 2018 12 10 00 00 00 end 2018 12 20 00 00 00 count 34 id 2 name B
  • 有没有办法避免自动更新 Rails 时间戳字段?

    如果您有数据库列created at and updated at当您创建和更新模型对象时 Rails 将自动设置这些值 有没有办法在不接触这些列的情况下保存模型 我正在引入一些旧数据 我想根据 不同名称的 旧数据字段中的相应值设置这些值
  • 在 React 应用程序中简单连接到 mongodb

    我使用 create react app 创建了简单的反应应用程序 这个应用程序包含表单 验证和引导程序 没有什么花哨的东西能像魅力一样发挥作用 我还注册了 mongo 以获得免费集群 以便我可以发送一些数据 所以我有这个网址 mongod
  • 设计 React Hooks 可防止 React-hooks/exhaustive-deps 警告

    我正在设计一个钩子 仅当钩子依赖项发生变化时才获取数据 它按预期工作但我收到了 linter 警告 React Hook useEffect was passed a dependency list that is not an array
  • 黄瓜与 RSpec

    我想开始深入研究 BDD 我以前从未使用过 TDD 现在 不确定我是否应该从学习 RSpec 开始 然后跳到 Cucumber 或者直接使用 Cucumber 我一直在互联网上阅读有关两者的内容 在我看来 Cucumber 可能是 RSpe
  • ubuntu 12.04 ruby​​ 2.0 Rails:找不到“thread_safe”

    我正在 ubuntu 12 04 上安装 Rails 使用以下方法手动安装 如何在 Ubuntu 12 04 上正确安装 ruby 2 0 0 https stackoverflow com questions 16222738 how t

随机推荐

  • Android - 基本的经过身份验证的 HTTP 请求

    所以基本上我需要我的 android 应用程序使用这样的 url 连接到网络服务 http 用户名 电子邮件受保护 cdn cgi l email protection 又名基本身份验证 显然 网络应用程序在允许访问之前会检查用户名和密码
  • 为什么我的时间戳在时区上发生了变化?

    我在 PostgreSQL 9 1 数据库中有这个日期timestamp without time zone column 2012 11 17 13 00 00 它应该是 UTC 格式 而且确实如此 我通过选择它作为 UNIX 时间戳来验
  • 测试电子邮件功能的好方法

    开发一个通过电子邮件通知的应用程序 我想运行测试而不向生产服务器和客户端发送电子邮件 几年前 我记得有人因电子邮件循环不良而导致我们的交换服务器瘫痪 并且不想重复 对开发设置有什么建议吗 目前认为一个简单的 SMTP 服务器就可以完成这项工
  • 如何在QT中的其他小部件中创建对象小部件

    在我的应用程序中 我有三个名为 Widget one 和 two 的小部件 我尝试在主函数中创建小部件的对象 并将其作为参数传递给另一个小部件 它编译成功 但应用程序在运行之前崩溃 请参考下面的代码并指导我 main cpp include
  • 如何使用其所在目录的工作目录执行任意脚本?

    我需要从 bash 执行一个 groovy 脚本文件 并且我需要该脚本具有它所在目录的工作目录 也就是说 在我的 bash 脚本中 我这样做 opt script myscript groovy 但这似乎将工作目录设置为 etc init
  • 具有嵌套数据源的 Angular Material 表

    我在中显示 JSON 文件的数据mat table The mat table显示行效果很好 但我必须连续显示数组内的数据 但是 我不知道最好使用什么谓词 我尝试了 where 谓词但它不起作用 Data fname Mark lname
  • Python:计算字符串中列表项的出现次数

    如果我有以下列表 vowels a e i o u 和另一个清单 words happiness yellow 如何计算每个单词中元音的数量 即 happy 3 yellow 2 使用列表理解 gt gt gt vowels a e i o
  • IIS 上的 Owin Web 请求无限期挂起

    我们在负载均衡器后面的 Win 2012 R2 上的 IIS 8 5 上运行 Owin 应用程序 在某些情况下 对某些 URL 的请求会无限期地挂起 如果用户在浏览器中选择取消 并重新加载页面 则一切正常并且服务器响应很快 In IIS m
  • 如何检查h2数据库是否需要升级?

    On H2下载网站 http h2database com html download html有一个Database Upgrade Helper File用于从 1 1 升级到更新版本 我想知道是否有一种好的 干净的方法来检查数据库是否
  • Chrome 中奇怪的边框宽度行为 - 浮点边框宽度?

    某些流畅的设计 尤其是那些涉及 width iFrame 的设计 似乎会在 Chrome 中导致一些奇怪的舍入类型错误 我有版本 21 这把小提琴 http jsfiddle net uzQJE 14 说明了问题 将边框设置为整数像素值 当
  • 使用 Redis 哈希与多个键的性能比较

    好的 我目前正计划使用 Redis 作为我的 NoSQL 数据库的前端缓存 我将在 Redis 数据库中存储大量常用的用户数据 我想知道是否制作一个key value每个用户的条目会更好或使用Redis hash其中字段是user id并且
  • 使用javascript,如何获取元素的位置

    就像标题所说 如何获取元素相对于其在网页中的位置的 x y 位置以及它们的定位方案 如绝对 相对等 在现代浏览器中 getBoundingClientRect 和 getClientRects 将为您提供描述元素的矩形对象 看https d
  • Spark Ar 代码自动完成功能在 Visual Studio Code 中不起作用

    我遵循官方文档 https developers facebook com docs ar studio scripting basics code autocomplete 当我将 VScode 中的 script js 编辑到 Mac
  • WinForms 应用程序中的控制器/静态状态类 - 放在哪里?

    我正在编写一个 WinForms 应用程序 并希望有一个 MVC 类型 设计 实际上更多的是MVP或者MVVM 计划是有一个中央控制器来完成所有实际工作 以便表单仅渲染视图模型并处理用户输入 但实际执行的所有操作都通过控制器进行 我只是想知
  • 未检测到文档的语法约束(DTD 或 XML 架构)(Android)

    我和这里的许多人有同样的问题 但我确实有 xmlns android 和 xml 标签 我仍然有同样的错误 我不想只点击设置中的忽略而不是警告 因此这里发布了问题 来源是
  • 已弃用的 StaticLayout 的替代品是什么

    应该用什么来代替 StaticLayout layout new StaticLayout text paint width Alignment ALIGN NORMAL mSpacingMult mSpacingAdd false 给出这
  • 嵌套 DirectConnection 信号导致段错误

    这是我的后续这里没有答案的问题 https stackoverflow com questions 27682241 qpixmap it is not safe to use pixmaps outside the gui thread
  • 将 Mongodb 数据库导入 Docker 容器

    我有一个docker container生成自一个docker image其中有mongoDB安装 我想从本地计算机导出数据库并将其导入到该计算机中docker container 其步骤是什么 我尝试通过以下方式导出整个数据库mongod
  • 使用 MSBuild 命令行指定发布版本作为项目的程序集版本

    我有一个简单的批处理文件 我从 DOS 命令行运行该文件 用于构建一个小型 C 应用程序 该应用程序发布单击一次 http en wikipedia org wiki ClickOnce项目 其中一行是这样的 msbuild MyApp c
  • Rails API ActiveStorage DirectUpload 产生 422 错误 InvalidAuthenticityToken

    我对 Rails API 应用程序主动存储有疑问 我有 React 从我想上传文件的地方 import React from react import DirectUpload from activestorage class SignIn