使用Devise进行身份验证失败的自定义XML响应

时间:2012-01-02 00:53:39

标签: ruby-on-rails ruby xml devise

我正在使用XML POST来登录我的用户,如果身份验证不起作用,我需要返回XML响应。但是,XML响应的格式需要是自定义的,我不知道在Devise中我应该更改此输出。

在'user_sessions_controller.rb'的'create'方法中,我有一个vanilla调用:

def create
  resource = warden.authenticate!(:scope => resource_name, 
                                  :recall => "#{controller_path}#new")

返回:

<errors> 
  <error>Invalid email or password.</error>
</errors>

但是我需要把它包装起来:

<AppName>
  <errors>
    <error>Invalid email or password.</error>
  </errors>
</AppName>

1 个答案:

答案 0 :(得分:7)

您可以在自定义失败应用中重新定义http_auth_body方法:

# lib/custom_failure_app.rb

class CustomFailure < Devise::FailureApp
  protected
    def http_auth_body
      return i18n_message unless request_format
      method = "to_#{request_format}"
      if method == "to_xml"
        { :errors => { :error => i18n_message } }.to_xml(:root => Rails.application.class.parent_name)
      elsif {}.respond_to?(method)
        { :error => i18n_message }.send(method)
      else
        i18n_message
      end
    end
end

然后将其添加到initializers/devise.rb

config.warden do |manager|
  manager.failure_app = CustomFailure
end

并将其添加到application.rb

config.autoload_paths += %W(#{config.root}/lib)

结果:

curl -X POST http://localhost:3000/users/sign_in.xml -d "{}"                                                                 
<?xml version="1.0" encoding="UTF-8"?>
<DeviseCustom>
  <errors>
    <error>You need to sign in or sign up before continuing.</error>
  </errors>
</DeviseCustom>