2017-07-12 30 views
0

こんにちは、私の質問を表示していただきありがとうございます。私は別のサーバー上のReactフロントエンドで動作するRails APIを構築しています。私はDevise Token Auth gemを使用しています。ログインに成功し、ログアウトし、問題なく複数のリソースを取得できます。変更トークンを処理するために、私は各要求時にヘッダーを更新しています。Devise Token AuthはPUTルートで認証されません

私は401完全なエラーメッセージを取得、その場合には、私は、リソースを更新するために、PUT要求を作るしようとしたとき、私はあるに実行している問題は、:

Started PUT "/api/stores/3/orders/1" for 127.0.0.1 at 2017-07-12 16:00:05 -0400 
Processing by Api::OrdersController#update as HTML 
    Parameters: {"order"=>{"id"=>1, "provider_notes"=>"tailor notes"}, "headers"=>{"client"=>"YVa0NIlxAdm6BLQXk0xeJw", "access-token"=>"bNc9BB0TgICIJzGfM4H_6A", "uid"=>"[email protected]"}, "store_id"=>"3", "id"=>"1"} 
Can't verify CSRF token authenticity. 
Filter chain halted as :authenticate_user! rendered or redirected 
Completed 401 Unauthorized in 1ms (Views: 0.1ms | ActiveRecord: 0.0ms) 

チェックした後、アクセストークンを実際には私が最後のリクエストから得たトークンなので、エラーメッセージに印刷されています。ここで私が協力しているコントローラがあります。私はauthenticate_userに合格することができません!アクションの前に。

class Api::OrdersController < ApplicationController 
    before_action :authenticate_user! 
    before_action :set_order, only: [:show, :update] 

    def index 
    render :json => current_user.store.open_orders.as_json(include: [:customer], methods: [:alterations_count]) 
    end 

    def show 
    render :json => @order.as_json(include: [:customer, :items => {include: :item_type}]) 
    end 

    def update 
    if @order.update(order_params) 
     render :json => @order 
     .as_json(include: [:customer, :items => {include: :item_type}]) 
    else 
     byebug 
    end 
    end 

    private 

    def set_order 
    @order = Order.find(params[:id]) 
    end 

    def order_params 
    if current_user.tailor? 
     params.require(order).permit(:requester_notes, :arrived, :fulfilled) 
    end 
    end 
end 

私が使っていたget要求とput要求が異なっている理由は何ですか? Devise Auth Tokenでこれを回避するためのアドバイスはすばらしいでしょう。ありがとう。

答えて

1

あなたはauthenticate_user!を使用していますか?念願から?

はい、それはAPI のために働くことができない場合は、あなたがmodel_controller /あなたのAPI application_controllerに

をそれを置くか、モジュールをcretaeし、必要な場所にそれを含めることができ、独自のヘルパーメソッド

を作成する必要があります

次に、beforeアクションをauthenticate_with_tokenに変更してください!

def current_user_api 
    @current_user ||= User.find_by(auth_token: request.headers['Authorization']) 
    end 

    def user_signed_in_api? 
    current_user_api.present? 
    end 

    def authenticate_with_token! 
    render json: { errors: "Not authenticated" }, 
     status: :unathorized unless user_signed_in_api? 
    end 

この本は、第5章では、あなたに http://apionrails.icalialabs.com/book/chapter_five

Can't verify CSRF token authenticity.

のために、あなたのアプリケーションのコントローラでこれを置くことができるのに役立ちます

protect_from_forgery with: :null_session 
    skip_before_action :verify_authenticity_token, if: :json_request? 

    protected 
    def json_request? 
     request.format.json? 
    end 
関連する問題