Tôi nhận được lỗi mã thông báo CSRF không hợp lệ khi cố gắng cập nhật (hoặc tạo) bản ghi. Tôi đang sử dụng Elixir v1.0.3, Erlang/OTP 17 [erts-6.3], và Phoenix v0.8.0 (tôi nghĩ rằng, tôi không chắc chắn làm thế nào để kiểm tra phiên bản của Phoenix). Tôi đang tạo một ứng dụng web chủ yếu theo hướng dẫn Phoenix và các tài nguyên ví dụ về Elixir Dose Jobsite. Tuy nhiên, khi tôi cố gắng đăng thông tin từ một biểu mẫu html, tôi nhận được lỗi mã thông báo CSRF không hợp lệ. Theo lời khuyên trong lỗi, tôi đã thêm 'x-csrf-token': csrf_token vào hành động.Phoenix - Lỗi mã thông báo CSRF (Cross Site Forgery Protection) không hợp lệ
edit.html.eex:
<h2>Edit Directory</h2>
<form class="form-horizontal" action="<%= directory_path @conn, :update, @directory.id, 'x-csrf-token': @csrf_token %>" method="post">
<div class="form-group">
<label for="directory" class="col-sm-2 control-label">Directory</label>
<div class="col-sm-10">
<input type="hidden" name="_method" value="PATCH">
<input type="text" class="form-control" value="<%= @directory.directory %>" name="directory" placeholder="Directory" required="required">
</div>
</div>
...
nhưng tôi nhận được lỗi sau:
[error] #PID<0.579.0> running Ainur.Endpoint terminated
Server: localhost:4000 (http)
Request: POST /config/directories/2?x-csrf-token=
** (exit) an exception was raised:
** (Plug.CSRFProtection.InvalidCSRFTokenError) Invalid CSRF (Cross Site Forgery Protection) token. Make sure that all your non-HEAD and non-GET requests include the csrf_token as part of form params or as a value in your request's headers with the key 'x-csrf-token'
(plug) lib/plug/csrf_protection.ex:54: Plug.CSRFProtection.call/2
(ainur) web/router.ex:4: Ainur.Router.browser/2
(ainur) lib/phoenix/router.ex:2: Ainur.Router.call/2
(plug) lib/plug/debugger.ex:104: Plug.Debugger.wrap/3
(phoenix) lib/phoenix/endpoint/error_handler.ex:43: Phoenix.Endpoint.ErrorHandler.wrap/3
(ainur) lib/ainur/endpoint.ex:1: Ainur.Endpoint.phoenix_endpoint_pipeline/2
(plug) lib/plug/debugger.ex:104: Plug.Debugger.wrap/3
(phoenix) lib/phoenix/endpoint/error_handler.ex:43: Phoenix.Endpoint.ErrorHandler.wrap/3
Theo như tôi có thể nói (bị mới để Elixir, Phoenix, và HTML), " hành động "về cơ bản là một đường dẫn và bất kỳ tham số nào tôi đặt trong đó sẽ tìm đường quay lại ứng dụng. Và, thực sự, tôi thấy rằng x-csrf-token = "" được truyền lại cho router, vì vậy @csrf_token không được chính xác. Tôi không chắc chắn chính xác nơi mà các csrf_token đến từ, vì vậy tôi không biết làm thế nào để tham khảo nó (hoặc có lẽ tôi đang làm điều này hoàn toàn sai).
Bất kỳ ý tưởng nào cũng sẽ được đánh giá cao.
Cảm ơn bạn đã trả lời chi tiết. Nó chỉ ra tôi đang chạy Phoenix 0.8.0, do đó, các mã dưới đây hoạt động, nhưng bạn đã lưu cho tôi một nhức đầu lớn khi tôi nâng cấp lên 0.9.0! –
Cảm ơn một lần nữa @ a4word, tôi nâng cấp lên Phoenix 0.9.0 và thay đổi mẫu để lấy mã thông báo từ cookie. Tuy nhiên, kỳ lạ đủ, nó có vẻ làm việc, nhưng tôi vẫn nhận được một lỗi mã thông báo CSRF (Cross Site Forgery Protection) không hợp lệ. Mã thông báo là 'ne0GATpoc/EW6jbIbC7tmfkAWl4qb1opTPWmmfYFTRY =' (không có dấu cách) và mẫu tạo url «POST/config/directories/9? X-csrf-token = ne0GATpoc% 2FEW6jbIbC7tmfkAWl4qb1opTPWmmfYFTRY% 3D' Tôi không biết tại sao Plug.CSRFProtection lại không thích nó Bạn có biết hay tôi nên mở một câu hỏi khác? –
Tôi đã đổi tên mã thông báo trong mẫu từ: ''x-csrf-token": Map.get (@ conn.req_cookies, "_csrf_token") 'thành:'' _csrf_token ': Map.get (@ conn.req_cookies , "_csrf_token") 'và bây giờ nó hoạt động –