关于Rails / Devise:Rails / Devise – 通过json请求创建新用户

Rails/Devise - Creating new users via json request

我想通过JSON做一个新的用户注册,但是我得到了一个无效的真实性令牌错误。

我不想打开所有控制器的伪造支票。有关于如何覆盖注册控制器的建议吗?

这是我的代码:

1
2
3
4
5
6
7
class Api::MobileRegistrationsController  < Devise::RegistrationsController
  skip_before_filter :verify_authenticity_token
  respond_to :json
  def create
    super
  end
end

路线:

1
2
3
4
5
6
7
Whitney::Application.routes.draw do
  resources :apps
  devise_for :users
  namespace :api do
    resources :tokens, :only => [:create, :destroy]
    resources :MobileRegistrations, :only => [:create]
  end

我得到一个错误:

1
2
Routing Error
uninitialized constant Api::MobileRegistrationsController

我不能用这种方式鼓励你,因为你的应用程序很容易受到CSRF攻击。

了解CSRF的一个好资源:了解Rails真实性令牌

你最好把EDOCX1[1]包含在你的请求中。这在一些关于so的问题中进行了讨论,例如(阅读所有答案):rails-invalidauthentitytoken for json/xml请求

想法:

  • 使用<%= form_authenticity_token %>检索令牌

  • 在您的请求中添加一个authenticity_tokenpost参数和令牌。

  • 如果通过uri传递参数,请不要忘记对令牌值进行编码:

    1
    url +="&authenticity_token=" + encodeURIComponent( <%= form_authenticity_token %> );


    因为你的错误

    Routing Error uninitialized constant
    Api::MobileRegistrationsController

    它表示控制器不在正确的文件夹中。因为你在使用

    1
    2
    3
    4
      namespace :api do
        resources :tokens, :only => [:create, :destroy]
        resources :MobileRegistrations, :only => [:create]
      end

    您需要将mobileregistrations放到controllers/api文件夹中。或者你可以用

    1
    2
    3
    scope"/api" do
      resources :MobileRegistrations, :only => [:create]
    end


    您可以构建自己的控制器,它不是从一个设计控制器派生出来的。

    1
    2
    3
    4
    5
    6
    7
    8
    def UserSignupApiController < ApplicationController
      skip_before_filter :authenticate_user!
      respond_to :json
      def create
        @user = User.create(params[user])
        respond_with(@user)
      end
    end

    我想你明白了。就像在Rails console中那样,您只是实例化您的用户。不过,我不推荐这种做法