2017-04-10 9 views
0

この問題で見つかったものはすべて古くなっているか、動作しません。Rails 5 Devise:JSONを返すsign_in失敗

ゴール:ユーザーがモバイルアプリケーションから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、:only =>:new' =>' after_action:handle_failed_login、:only =>:create' –

+0

これは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と一緒に働いています。 –

関連する問題