2015-01-14 10 views
6

मेरे पास पोस्ट डेटा के साथ एक एपीआई कॉल है; मान लें कि यह लॉगिन प्रक्रिया है।लार्वा एपीआई टोकनमिस्मैच अपवाद

क्रोम का डाकिया विस्तार मैं भेज साथ

, पोस्ट के माध्यम से, उपयोगकर्ता नाम और पासवर्ड में उपयोगकर्ता लॉग इन करने के लेकिन मैं इस संदेश मिला:।

Illuminate \ Session \ TokenMismatchException 

मेरी बेस नियंत्रक में मेरे पास है:

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

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

    } 

जब मैं पहले से पंक्ति को हटा देता हूं तो सब कुछ ठीक काम करता है। लेकिन यह एक समाधान नहीं हो सकता है। कोई भी पोस्ट कॉल इस त्रुटि संदेश को प्राप्त करेगा। मुझे पता है कि मुझे इस _ टोकन की आवश्यकता है। लेकिन जब मैं एपीआई से फोन करता हूं तो मुझे यह टोकन कैसे मिलता है? मुझे पता है कि मैं लार्वेल के अंदर एक टोकन बना सकता हूं, लेकिन जब मैं एपीआई के माध्यम से बाहर से कॉल करता हूं तो मैं यह कैसे कर सकता हूं?

+0

क्योंकि आप, एक पैरामीटर के रूप के माध्यम से टोकन भेजने के लिए CSRF फिल्टर इनपुट के _token क्षेत्र की जाँच करेगा के रूप में की जरूरत है। यदि आप इसे नहीं भेज रहे हैं तो यह चेक असफल हो जाएगी। –

+0

ठीक है। संदिग्ध वर्णन के लिए sry ... मुझे पता है कि मुझे इस _ टोकन की जरूरत है।लेकिन जब मैं एपीआई कॉल करता हूं तो मुझे यह टोकन कैसे मिलता है? मुझे पता है कि मैं लार्वेल के अंदर एक टोकन बना सकता हूं, लेकिन जब मैं एपीआई के माध्यम से बाहर से कॉल करता हूं तो मैं यह कैसे कर सकता हूं? – goldlife

+0

आम तौर पर एपीआई का उपयोग क्रॉस साइट अनुरोधों के लिए किया जाता है। तो आपकी सीएसआरएफ सुरक्षा व्यर्थ है। इसका मुख्य रूप से अनुप्रयोगों और वेबसाइटों के लिए उपयोग किया जाता है। लेकिन इसे लॉग इन करने पर अक्षम करें, और उसके बाद सफल लॉग पर उपयोगकर्ता को csrf_token मान को सहायक 'csrf_token();' –

उत्तर

9

आम तौर पर एपीआई का उपयोग क्रॉस साइट अनुरोधों के लिए किया जाता है। तो आपकी सीएसआरएफ सुरक्षा व्यर्थ है।

यदि आप इसे क्रॉस-साइट का उपयोग नहीं कर रहे हैं, तो संभावना है कि एक एपीआई आप जो करने की कोशिश कर रहे हैं उसके लिए इष्टतम समाधान नहीं है। वैसे भी, आप एक एपीआई एंडपॉइंट बना सकते हैं जो एक टोकन देता है।

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

आप कुछ तरीकों पर CSRF सुरक्षा अक्षम करना चाहते हैं, तो आप except या only इस्तेमाल कर सकते हैं।

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

कृपया official Laravel documentation देखें।

1

बस इसे सुनें। 30 मिनट से पहले मुझे इसी समस्या का सामना करना पड़ रहा था। अब यह हल हो गया। बस कोशिश करो।

गोटो अनुप्रयोग -> HTTP-> कर्नेल

गिरी फ़ाइल खोलें। \ अनुप्रयोग \ http \ मिडिलवेयर \ VerifyCsrfToken :: वर्ग ,

सिर्फ //

यह Thatz का उपयोग कर इस विशेष कोड को अक्षम:

वहाँ

आप देख सकते हैं! यह काम करेगा!

तो तुम एपीआई बुला से मिडलवेयर निकाल सकते हैं कि (यदि आप ऐसा चाहते हैं, तो ..)

5

बिल्कुल don't use इस दृष्टिकोण।

ओपन VerifyCsrfToken कक्षा खोलें और $except संपत्ति को परिभाषित करें जिसमें मार्गों की एक सरणी होगी, जहां सीएसआरएफ सुरक्षा लागू नहीं की जाएगी।

नीचे उदाहरण:

<?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); 
    } 
} 
संबंधित मुद्दे