【发布时间】:2014-06-26 11:43:35
【问题描述】:
我最近从 Rails 3.2 升级到 Rails 4,现在我的应用程序端点之一出现问题。
我正在尝试让外部服务 (Hellosign) 在用户执行操作后将一些 JSON 发布到我的应用程序。为此,我的端点必须返回一个 200 HTTP 代码和一个包含以下文本的响应正文:“Hello API Event Received”
这在 Rails 3.2 中运行良好,但我在 Rails 4 中遇到了麻烦。我会在 config/routes.rb 中为此设置路由
post 'document' => 'requests#document'
我的用户模型包括has_many :requests,我的请求模型包括belongs_to :account。我正在使用最新版本的 Devise。
Requests Controller 的精简版如下:
class RequestsController < ApplicationController
before_filter :authenticate_user!, except: [:document]
skip_before_action :verify_authenticity_token, :only => [:document]
def document
render text: "Hello API Event Received"
@json = JSON.parse(params["json"])
end
end
我跳过设计身份验证并验证 document 操作的真实性令牌,以便它可以实际接收来自 API 的 POST,该 API 具有自己的身份验证协议。
问题:我从 API 收到回调失败的消息,并出现“访问被拒绝”错误。当我在 Heroku 中检查生产日志时,我收到了 ERROR invalid body size 错误消息。
我最好的猜测是 Rails 4 中的 Devise 发生了一些变化,我不能再使用 before_filter 和 skip_before_action 位来允许 document 操作作为面向公众的端点。
任何帮助将不胜感激!
【问题讨论】:
-
在呈现响应后解析 json 很奇怪。这是故意的吗?
-
您是否尝试自己发布到该端点?
-
好吧,我想我需要在解析数据之前传递收到事件的消息。它在 Rails 3.2 版本中工作。我确实尝试过自己通过 Net::HTTP 发送帖子;我收到了
500 Internal Server Error -
Devise 跟它有什么关系?如果您仅将其用于公共端点,为什么需要使用 Devise 进行身份验证?你为什么不这样使用
skip_before_filter:skip_before_filter :authenticate_user!, :only => :documents -
嗨,丰富。这是一个精简的控制器,不显示需要用户身份验证的其他操作。我的想法是,我没有以 Rails 4 可接受的方式从 Devise 身份验证中排除
document操作。根据设计文档,您应该指定before_action :authenticate_user!,所以我相信我需要这样做,然后除了document操作,对吧?
标签: ruby-on-rails heroku ruby-on-rails-4 devise endpoint