5

Deviseとauthenticatable_tokenを使用してRailsアプリにログインするためのAPIを構築しようとしています。API モジュールで SessionsController を作成し、次のコードを sign_in に記述しました。

module Api
  module V1
    class SessionsController < Devise::SessionsController

      def create  
        resource = warden.authenticate!(scope: resource_name, recall: "#{controller_path}#new")
        sign_in(resource_name, resource) 
        if current_user  
          if !current_user.authentication_token  
            current_user.reset_authentication_token! 
          end
          render json: {success: true, auth_token: resource.authentication_token, email: resource.email}
        else 
          invalid_login_attempt
        end 
      end

      protected

      def invalid_login_attempt
        warden.custom_failure!
        render json: {success: false, message: "Error with your login or password"}, status: 401
      end
    end
  end
end

問題は、トークンなしでログインを使用すると、アプリが 401 を発生させることです。

RestClient.post "http://localhost:3000/api/v1/users/sign_in", {user: {email: "tester@test.biz", password: "FILTERED"}}.to_json, :content_type => :json, :accept => :json

しかし、サインアップ メソッドによって提供されたトークンを設定すると、次のように動作します。

response_json = RestClient.post "http://localhost:3000/api/v1/users/sign_in?auth_token=#{@token}", {user: {email: "tester@test.biz", password: "FILTERED"}}.to_json, :content_type => :json, :accept => :json

では、なぜこれが?サインイン時にトークン認証プロセスを無効にすることはできますか?

4

1 に答える 1

3

json形式を使用すると、Deviseコントローラーはそのままでは機能しません。次のいずれかを実行する必要があります。

  • コンテンツタイプ=>jsonおよびaccept=>jsonディレクティブを削除します
  • config.navigational_formats = [:html、:json]をデバイス構成ファイルに追加します
  • コントローラーをオーバーロードしてそのフォーマットを処理するには、特定の応答が必要です。これは非常に一般的です。

あなたはそこで実用的な例を得ることができますhttp://jessehowarth.com/devise

于 2012-10-01T16:23:25.790 に答える