gpt4 book ai didi

ios - 设计注册 Controller 拒绝来自 iOS 的 POST

转载 作者:行者123 更新时间:2023-11-29 12:39:11 25 4
gpt4 key购买 nike

我正在尝试为 iOS 应用制作 RoR 后端。我决定尝试使用 Devise (3.2.4) 来保护 API。但是,我无法通过设计生成的 http://localhost:3000/users 注册用户。

我尝试过使用默认设计注册 Controller 以及覆盖它并创建我自己的 Controller 。

使用 restkit,我的 iOS 应用正在发送这个 JSON:

{"user":{"email":"Flash.gordon@gmail.com", "password":"Test123", "password_confirmation":"Test123"}}

方法 1 - 标准设计 Controller

响应是 401 Unauthorized - HTTP Token: Access denied.

Started POST "/users.json" for 127.0.0.1 at 2014-08-24 18:19:34 -0400
Processing by Devise::RegistrationsController#create as JSON
Parameters: {"user"=>{"password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "email"=>"Flash.gordon@gmail.com"}, "registration"=>{"user"=>{"password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "email"=>"Flash.gordon@gmail.com"}}}
Can't verify CSRF token authenticity
Rendered text template (0.1ms)
Filter chain halted as :restrict_access_by_token rendered or redirected
Completed 401 Unauthorized in 5ms (Views: 2.5ms | ActiveRecord: 0.0ms)

在这里,似乎正在调用 :restrict_access_by_token。但是,我不确定为什么,因为这是一个注册新用户的帖子,所以我没有要发送的 token ,但我期待一个回馈。另外,我不知道为什么它会加倍发送的参数并在此处添加重复的 registration JSON 数组。

方法 2 - 覆盖设备注册 Controller

出现上述错误后,我尝试忽略“create”方法的“:restrict_access_by_token”并相应地更新路由

路线.rb

devise_for :users, :controllers => {:registrations => "api/registrations"}

app/controllers/api/registrations_controller.rb

module API
class RegistrationsController < Devise::RegistrationsController
prepend_before_filter :allow_params_authentication!, :only => :create

skip_before_filter :restrict_access_by_token, :only => :create
respond_to :json


def create
user = User.new(sign_up_params)
if user.save
render :json=> user, :status=>201
return
else
warden.custom_failure!
render :json=> user.errors, :status=>422
end
end
end
end

这里的响应是一个 422 Unprocessable Entity 并且响应是:

{"email":["can't be blank"],"password":["can't be blank"]}

服务器日志:

Started POST "/users.json" for 127.0.0.1 at 2014-08-24 18:30:08 -0400
Processing by API::RegistrationsController#create as JSON
Parameters: {"user"=>{"password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "email"=>"Flash.gordon@gmail.com"}, "registration"=>{"user"=>{"password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "email"=>"Flash.gordon@gmail.com"}}}
Can't verify CSRF token authenticity
(0.1ms) begin transaction
User Exists (0.1ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = 'flash.gordon@gmail.com' LIMIT 1
(0.1ms) rollback transaction
Completed 422 Unprocessable Entity in 93ms (Views: 1.0ms | ActiveRecord: 0.3ms)

因此,Devise 似乎以某种方式获取了参数,但没有正确处理它们。可能与第二个 registration JSON 数组有关。

关于如何解决这些问题有什么想法吗?我应该放弃自定义 Controller 吗?如何摆脱 Devise 正在生成的 registration JSON 数组?

谢谢

最佳答案

我找到了解决问题的方法。对于上面的方法 2(使用我的自定义注册 Controller ),我得到了错误响应:

{"email":["can't be blank"],"password":["can't be blank"]}

这是因为我也发送了 password_confirmation 属性,用户注册不需要它(我相信只有帐户更新)。删除后,Devise 正确解析了 JSON。

对于在使用 Devise API 时遇到类似问题的任何人,I found this gist有帮助。这里有一个简单的项目,我也用它来建模我的 JSON API,以绕过 this repo by brianweiner. 中发布的 :token_authenticatable 的弃用。

我必须做的唯一改变是 user.rb 模型。循环 generate_authentication_token 的最后一行应如下所示以避免 noMethodError(基于上述要点):

      break token unless User.where(authentication_token: token).first

关于ios - 设计注册 Controller 拒绝来自 iOS 的 POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25476969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com