2015-09-15 21 views
16

Tôi đang cố gắng tạo Tab trang Facebook trỏ đến trang web của mình. Facebook gửi yêu cầu HTTP POST tới url của trang web của tôi. Vấn đề ở đây là máy chủ đã tích hợp sẵn trong tầm kiểm soát CSRF, và nó sẽ trả về lỗi sau:Cách chọn lọc vô hiệu hóa kiểm tra CSRF trong khung Phoenix

(Plug.CSRFProtection.InvalidCSRFTokenError) invalid CSRF (Cross Site Forgery Protection) token, make sure all requests include a '_csrf_token' param or an 'x-csrf-token' header` 

Máy chủ hy vọng một CSRF token Facebook không thể có. Vì vậy, tôi muốn chọn lọc vô hiệu hóa CSRF cho đường dẫn www.mywebsite.com/facebook.

Tôi có thể làm điều đó trong Phoenix Framework như thế nào?

Trả lời

24

Plug.CSRFProtection được bật trong bộ định tuyến của bạn với protect_from_forgery. Điều này được đặt theo mặc định trong đường ống browser. Khi một plug đã được thêm vào, không có cách nào để vô hiệu hóa nó, thay vào đó nó không phải được đặt ở vị trí đầu tiên. Bạn có thể làm điều này bằng cách di chuyển nó ra khỏi browser và chỉ bao gồm nó khi nó được yêu cầu.

defmodule Foo.Router do 
    use Foo.Web, :router 

    pipeline :browser do 
    plug :accepts, ["html"] 
    plug :fetch_session 
    plug :fetch_flash 
    #plug :protect_from_forgery - move this 
    end 

    pipeline :csrf do 
    plug :protect_from_forgery # to here 
    end 

    pipeline :api do 
    plug :accepts, ["json"] 
    end 

    scope "/", Foo do 
    pipe_through [:browser, :csrf] # Use both browser and csrf pipelines 

    get "/", PageController, :index 
    end 

    scope "/", Foo do 
    pipe_through :browser # Use only the browser pipeline 

    get "/facebook", PageController, :index #You can use the same controller and actions if you like 
    end 

end 
+1

Cảm ơn bạn !! Nó hoạt động! :) –

Các vấn đề liên quan