我有以下自定义会话控制器:
class SessionsController < Devise::SessionsController
respond_to :json
def create
logger.debug(" CUSTOM AUTHENTICATION!!!!!!")
self.resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#failure")
sign_in(resource_name, resource)
render json: { :success => true }, status: 200
end
def failure
logger.debug(" CUSTOM FAILURE!!!!!!")
warden.custom_failure!
render json: { success: false, errors: ["Login Credentials Failed"] }, status: 401
end
end
我正在调用Ajax,我需要这个成功参数才能处理回调。
身份验证工作正常。我收到了success: true
作为回复
但是当身份验证失败时,我收到了默认响应:
"NetworkError: 401 Unauthorized - http://localhost:3000/users/sign_in.json"
Parameters:
{"error":"Invalid e-mail or password"}
我在那里错过了什么?为什么设计不会调用我的自定义失败消息?
我已经配置了devise.rb config:
config.navigational_formats = ["*/*", :html, :json]
答案 0 :(得分:0)
你正在修补Devise的SessionsController - 这个控制器在SessionsController中没有失败方法,你可以看到here。 401由 new 方法生成。但是,我不会修补那个方法,而是使用像这样的after_filter:
class SessionsController < Devise::SessionsController
after_filter :handle_failed_login, :only => :new
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
答案 1 :(得分:0)
您只需编辑设计配置并更改config.navigational_formats即可 然后使用以下命令更改路径:format =&gt; :JSON
config.navigational_formats = ['*/*', :html, :json]
api_v1_new_user_session_path(resource_name, :format => :json)
如果您进行此更改,则:调用将起作用