2015-01-14 19 views
6

Tôi có cuộc gọi API với dữ liệu bài đăng; giả sử đây là quá trình đăng nhập.API Laravel TokenMismatchException

Với phần mở rộng Postman của Chrome tôi gửi, qua POST, tên người dùng và mật khẩu để đăng nhập người sử dụng trong Nhưng tôi nhận được tin nhắn này:.

Illuminate \ Session \ TokenMismatchException 

Trong điều khiển cơ sở của tôi, tôi có:

/** 
    * Initializer. 
    * 
    * @return void 
    */ 
    public function __construct() { 
     // CSRF Protection 
     $this->beforeFilter('csrf', array('on' => 'post')); 

     // Layouts/Notifications 
     $this->messageBag = new Illuminate\Support\MessageBag; 

    } 

Khi tôi xóa hàng có beforeFilter, mọi thứ hoạt động tốt. Nhưng điều này không thể là một giải pháp. Mọi cuộc gọi POST sẽ nhận được thông báo lỗi này. Tôi BIẾT rằng tôi cần _token này. Nhưng làm cách nào tôi nhận được mã thông báo này khi tôi gọi từ API? Tôi biết rằng tôi có thể tạo ra một mã thông báo bên trong Laravel, nhưng làm thế nào tôi có thể làm điều này khi tôi gọi từ bên ngoài thông qua API?

+0

Bởi vì bạn cần phải gửi mã thông báo thông qua như một tham số, như bộ lọc CSRF sẽ kiểm tra các lĩnh vực _token của đầu vào. Nếu bạn không gửi, séc này sẽ không thành công. –

+0

ok. sry cho mô tả mơ hồ ... Tôi BIẾT rằng tôi cần _token này.Nhưng làm cách nào tôi nhận được mã thông báo này khi tôi gọi API? Tôi biết rằng tôi có thể tạo ra một mã thông báo bên trong laravel, nhưng làm thế nào tôi có thể làm điều này khi tôi gọi từ bên ngoài thông qua API? – goldlife

+0

Nói chung, API được sử dụng cho các yêu cầu trang web chéo. Vì vậy, bảo vệ CSRF của bạn là vô nghĩa. Nó chủ yếu được sử dụng cho các ứng dụng và trang web. Nhưng vô hiệu hóa nó trên đăng nhập, và sau đó đăng nhập thành công trong gửi người dùng giá trị csrf_token bằng cách gọi người trợ giúp 'csrf_token(); ' –

Trả lời

9

Nói chung, API được sử dụng cho các yêu cầu trang web chéo. Vì vậy, bảo vệ CSRF của bạn là vô nghĩa.

Nếu bạn không sử dụng nó qua nhiều trang, rất có thể là một API không phải là giải pháp tối ưu cho những gì bạn đang cố gắng làm. Dù sao, bạn có thể tạo điểm cuối API trả về mã thông báo.

public function getToken(){ 
    return Response::json(['token'=>csrf_token()]); 
} 

Nếu bạn muốn vô hiệu hóa CSRF bảo vệ trên một số phương pháp, bạn có thể sử dụng except hoặc only.

$this->beforeFilter('csrf', array('on' => 'post', 
           'except'=>array('methodName', 'anotherMethod') 
           )); 

Vui lòng tham khảo official Laravel documentation.

1

chỉ cần nghe nội dung này. Ngay trước 30 phút tôi đã phải đối mặt với cùng một vấn đề này. Bây giờ nó đã được giải quyết. chỉ cần thử này.

Goto App -> HTTP-> Kernel

mở tệp hạt nhân.

đó bạn có thể thấy: \ App \ Http \ Middleware \ VerifyCsrfToken :: lớp,

chỉ vô hiệu hóa mã đặc biệt này sử dụng //

thatz nó! Điều này sẽ làm việc!

Vì vậy mà bạn có thể loại bỏ các trung gian từ sự kêu gọi API (nếu bạn muốn như vậy ..)

5

Tuyệt đối don't use phương pháp này.

Mở lớp VerifyCsrfToken và xác định $except thuộc tính sẽ chứa một loạt tuyến đường, nơi sẽ không áp dụng bảo vệ CSRF.

Ví dụ dưới đây:

<?php 
declare(strict_types=1); 

namespace App\Http\Middleware; 

use Closure; 
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier; 

class VerifyCsrfToken extends BaseVerifier 
{ 
    protected $except = [ 
     'api/auth/login', 
     'api/*', // this works as well 
    ]; 

    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure     $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     return parent::handle($request, $next); 
    } 
} 
Các vấn đề liên quan