2017-04-13 7 views
9

मेरा ऐप बैकएंड पर फ्रंट एंड और लैरवेल 5.4 पर प्रतिक्रिया का उपयोग कर रहा है। बैकएंड से डेटा का अनुरोध करने के लिए मैं fetch() का उपयोग कर रहा हूं। समस्या यह है कि पेज लोड होने पर दो सत्र बनाए जाते हैं। एक TokenMismatchException सीएसआरएफ मिडलवेयर द्वारा फेंक दिया जाता है जब POST अनुरोध किया जाता है क्योंकि भेजा गया टोकन पहले सत्र से मेल खाता है, लेकिन यह दूसरे के खिलाफ जांचता है।लार्वेल एपीआई पर प्रतिक्रिया प्राप्त करें नया सत्र

a:3:{s:6:"_token";s:40:"7obvOzPaqqJDtVdij8RaqrvmTFLjKA2qnvYMxry6";s:9:"_previous";a:1:{s:3:"url";s:24:"http://localhost/page";}s:6:"_flash";a:2:{s:3:"old";a:0:{}s:3:"new";a:0:{}}} 

a:3:{s:6:"_token";s:40:"5Aiws9Qy72YzlkfWX81zkhzrSeiMDYjFWiLeDAwN";s:9:"_previous";a:1:{s:3:"url";s:41:"http://localhost/api/page";}s:6:"_flash";a:2:{s:3:"old";a:0:{}s:3:"new";a:0:{}}} 

अनुरोध:

मैं app.blade.php

<meta name="_token" content="{{ csrf_token() }}">

में टोकन सेट कर रहा हूं और लाने config

fetchConfig = { 
    headers: { 
     'Content-Type': 'application/json', 
     'Accept': 'application/json', 
     'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content') 
    }, 
    credentials: 'same-origin' 
}} 

यहाँ में टोकन हथियाने decrypted सत्र हैं यूआरएल: http://localhost/page

API URL: http://localhost/api/page

मैं से बनाया जा रहा है जब प्रतिक्रिया एप्लिकेशन अपनी प्रारंभिक GET अनुरोध करता है एक नया सत्र कैसे रोक सकते हैं?

+0

कौन सा सत्र ड्राइवर आप उपयोग कर रहे हैं? –

+0

मैं 'file' सत्र ड्राइवर का उपयोग कर रहा हूं। – bill

+0

यदि आपने जेडब्ल्यूटी एथ (जेएसओएन वेब टोकन प्रमाणीकरण) टोकन एपीआई को टोकन का उपयोग किया है। क्योंकि एपीआई राज्य को बनाए रख सकता है।इसलिए, यदि आपको सीएसआरएफ टोकन सत्यापन की आवश्यकता है, तो आपको इसे मेटा टैग में या एक निजी दावे के रूप में जेडब्ल्यूटी पेलोड के अंदर संग्रहीत करना होगा। –

उत्तर

9

Laravel स्वचालित रूप से प्रत्येक सक्रिय उपयोगकर्ता सत्र एप्लिकेशन द्वारा प्रबंधित के लिए एक CSRF "टोकन" उत्पन्न करता है। इस टोकन का उपयोग यह सत्यापित करने के लिए किया जाता है कि प्रमाणीकृत उपयोगकर्ता वास्तव में एप्लिकेशन को अनुरोध कर रहा है। : https://laravel.com/docs/5.4/csrf

एपीआई स्टेटलेस हैं। एपीआई में session जैसे कुछ भी नहीं है। इसलिए आपको एपीआई में सीएसआरएफ टोकन का उपयोग नहीं करना चाहिए। यदि आप लार्वेल के Kernel.php चेक करते हैं। आप देखेंगे कि टायलर ने एपीआई समूह में VerifyCsrf मिडलवेयर नहीं जोड़ा है। जो सुझाव देता है कि CSRF केवल सत्र के अनुरोध के लिए उपयोग किया जाता है i.e, राज्य के अनुरोध। मैं आपको एपीआई के लिए जेडब्ल्यूटी आधारित प्रमाणीकरण प्रणाली का उपयोग करने की सलाह दूंगा। जेडब्ल्यूटी check here के बारे में अधिक जानकारी के लिए।

आप जेडब्ल्यूटी के लिए इस laravel पैकेज का उपयोग कर सकते हैं: https://github.com/tymondesigns/jwt-auth

5

मुझे यकीन नहीं है कि आपका अनुरोध यूआरएल क्या है और आपका लक्ष्य एपीआई यूआरएल क्या है। सुनिश्चित करें कि दोनों एक ही डोमेन पर हैं (सबडोमेन सहित)।

मैं केवल API मार्गों के लिए CSRF सत्यापन निष्क्रिय करने के लिए अपने एक अच्छा विचार के रूप में इन अन्य डोमेन, मूल एप्लिकेशन आदि द्वारा इस्तेमाल किया जा सकता है लगता है

आप ऐसा कर सकते हैं निम्नलिखित वर्ग फ़ाइल जोड़कर: एप्लिकेशन/HTTP/मिडिलवेयर/

protected $middleware = [ 
    'csrf' => 'App\Http\Middleware\VerifyCsrfToken' 
]; 

अधिक जानने के लिए कैसे Laravel हमें:

<?php 

namespace App\Http\Middleware; 

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

class VerifyCsrfToken extends BaseVerifier 
{ 
    /** 
    * The URIs that should be excluded from CSRF verification. 
    * 
    * @var array 
    */ 
    protected $except = [ 
     'api/*', 
    ]; 
} 

VerifyCsrfToken.php नया वर्ग को इंगित करने के Kernal.php संपादित करना सुनिश्चित करें तों CSRF जाँच this laracast video

+0

उत्तर के लिए धन्यवाद! मैंने प्रश्न के अनुरोध और एपीआई यूआरएल को जोड़ा, क्योंकि वे सत्र डेटा में छिपाए गए थे। आपका समाधान सीएसआरएफ मिडलवेयर को बाईपास करने के लिए काम करता है, लेकिन कई सत्र अभी भी बनाए जा रहे हैं। यदि संभव हो तो मैं आदर्श रूप से इसे ठीक करना चाहूंगा। – bill

संबंधित मुद्दे