2017-04-10 22 views
0

我在这个问题上似乎找到的所有内容都已过时和/或无法正常工作。Rails 5设计:在sign_in上返回JSON失败

目标:当用户试图通过JSON从移动应用程序和用户名或密码登录是错误的,我想Rails的返回JSON数据,所以误差可以在应用程序中显示。

到目前为止,我已经做了以下内容:

class Users::SessionsController < Devise::SessionsController 
    # before_action :configure_sign_in_params, only: [:create] 
    skip_before_action :verify_authenticity_token 
    respond_to :json 

    # POST /resource/sign_in 
    def create 
    self.resource = warden.authenticate!(auth_options) 
    set_flash_message(:notice, :signed_in) if is_flashing_format? 
    sign_in(resource_name, resource) 
    yield resource if block_given? 
    respond_with resource, :location => after_sign_in_path_for(resource) do |format| 
     format.json {render :json => resource } # this code will get executed for json request 
    end 
    end 
end 

这行之有效的成功,但我不知道,当它不能做什么。现在,它会返回一个未定义的方法错误:

undefined method `users_url' for #<Users::SessionsController:0x0000000195fa28> 

回答

0

想通了。无论我尝试了多少次,CustomFailure都无法工作。我可以通过handle_failed_login在SessionsController中执行此操作:

class Users::SessionsController < Devise::SessionsController 
    # before_action :configure_sign_in_params, only: [:create] 
    after_filter :handle_failed_login, :only => :new 
    skip_before_action :verify_authenticity_token 
    respond_to :json 

    # POST /resource/sign_in 
    def create 
    self.resource = warden.authenticate!(auth_options) 
    set_flash_message(:notice, :signed_in) if is_flashing_format? 
    sign_in(resource_name, resource) 
    yield resource if block_given? 
    respond_with resource, :location => after_sign_in_path_for(resource) do |format| 
     format.json {render :json => resource } # this code will get executed for json request 
    end 
    end 

    private 
    def handle_failed_login 
    if failed_login? 
     render json: { success: false, errors: ["Login Credentials Failed"] }, status: 401 
    end 
    end 

    def failed_login? 
    (options = env["warden.options"]) && options[:action] == "unauthenticated" 
    end 
end 
+0

'after_filter工作:handle_failed_login,:只=>:new' =>'after_action:handle_failed_login,:只=>:create' –

+0

这并没有为我on Rails的5.1.2工作。回调永远不会被调用。 –

0

你应该看一看this SO question,将指向您在正确的方向。

基本上你需要处理登录失败。你可以这样做:

class CustomFailure < Devise::FailureApp 
    def respond 
    if http_auth? 
     http_auth 
    elsif request.content_type == "application/json" 
     self.status = 401 
     self.content_type = "application/json" 
     self.response_body = {success: false, error: "Unauthorized"}.to_json 
    else 
     redirect 
    end 
    end 
end 

这将处理JSON请求。我希望这有帮助!

+0

不幸的是,我永远无法使CustomFailure正常工作。我得到了它与handle_failed_login –