2012-03-01 12 views
14

में सीएसआरएफ टोकन प्राप्त करें मैं कार्यात्मक परीक्षण लिख रहा हूं और मुझे AJAX पोस्ट अनुरोध करने की आवश्यकता है। "सीएसआरएफ टोकन अमान्य है। कृपया फॉर्म को पुनः सबमिट करने का प्रयास करें"। मैं अपने कार्यात्मक परीक्षण में टोकन कैसे प्राप्त कर सकता हूं?परीक्षण

$crawler = $this->client->request(
    'POST', 
    $url, 
    array(
     'element_add' => array(
      '_token' => '????', 
      'name' => 'bla', 
    ) 

), 
    array(), 
    array('HTTP_X-Requested-With' => 'XMLHttpRequest') 
); 

उत्तर

18

सीएसआरएफ टोकन जनरेटर सामान्य सिम्फनी 2 सेवा है। आप सेवा प्राप्त कर सकते हैं और खुद को टोकन उत्पन्न कर सकते हैं। उदाहरण के लिए:

$csrfToken = $client->getContainer()->get('form.csrf_provider')->generateCsrfToken('registration'); 
    $crawler = $client->request('POST', '/ajax/register', array(
     'fos_user_registration_form' => array(
      '_token' => $csrfToken, 
      'username' => 'samplelogin', 
      'email' => '[email protected]', 
      'plainPassword' => array(
       'first' => 'somepass', 
       'second' => 'somepass', 
      ), 
      'name' => 'sampleuser', 
      'type' => 'DSWP', 
     ), 
    )); 

generateCsrfToken एक महत्वपूर्ण मापदण्ड इरादा जो परीक्षण में और के रूप में अन्यथा यह विफल रहता है एक ही होना चाहिए हो जाता है।

+0

कैसे जानते हैं कि फॉर्म में उपयोग किए जाने वाले $ इरादे पैरामीटर क्या हैं? – bux

+0

आप अपने इच्छित किसी भी $ इरादे का उपयोग कर सकते हैं, बस यह सुनिश्चित कर लें कि यह वही है जिसे आप टोकन – Gigala

+3

चेक करने के लिए भी उपयोग करते हैं सिम्फनी 3 में, '-> get (' form.csrf_provider ') द्वारा लौटाई गई सेवा को हटा दिया गया है। इसके बजाए '-> प्राप्त करें ('security.csrf.token_manager') का उपयोग करें। – iisisrael

11

के बाद एक लंबी खोज (i दस्तावेज़ में और कैसे CSRF टोकन प्राप्त करने के बारे में नेट पर कुछ भी नहीं पाया है) मैं एक रास्ता मिल गया:

$extract = $this->crawler->filter('input[name="element_add[_token]"]') 
    ->extract(array('value')); 
$csrf_token = $extract[0]; 

से पहले बनाने के प्रतिक्रिया से टोकन निकालें निवेदन।

+0

यह काम करता है, लेकिन यह परीक्षण करने के उद्देश्य पर निर्भर करता है: अगर यह एक व्यवहार परीक्षण है, ब्राउज़र के व्यवहार को दोहराने वाला है, तो यह निश्चित रूप से जाने के लिए (रास्ता है यह वही है जो ब्राउज़र प्रकार का करता है); लेकिन अगर यह एकीकरण परीक्षण है, तो नियंत्रक की जांच सीएसआरएफ ढांचे के साथ सही ढंग से एकीकृत हो रही है, तो यदि आप कर सकते हैं तो टोकन प्रबंधक के माध्यम से जाना अच्छा होता है। –

5

सिम्फोनी 3 में, अपने WebTestCase में, आप CSRF टोकन प्राप्त करने की जरूरत है:

$csrfToken = $client->getContainer()->get('security.csrf.token_manager')->getToken($csrfTokenId); 

$csrfTokenId पाने के लिए, सबसे अच्छा तरीका है की to force it in the options होगा अपने FormType():

class TaskType extends AbstractType 
{ 
    // ... 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'csrf_token_id' => 'task_item', 
     )); 
    } 

    // ... 
} 

तो इस मामले में: $csrfTokenId = "task_item";। या आप डिफ़ॉल्ट मान का उपयोग करने का प्रयास कर सकते हैं, यह आपके फॉर्म का नाम होगा।

फिर एक पोस्ट पैरामीटर के रूप में इसका इस्तेमाल करते हैं:

$client->request(
    'POST', 
    '/url', 
    [ 
    'formName' => [ 
     'field' => 'value', 
     'field2' => 'value2', 
     '_token' => $csrfToken 
    ] 
    ] 
); 
+0

यह symfony3 के समकालीन उत्तर है और इसे अधिक सक्रिय रूप से ऊपर रखा जाना चाहिए। यह स्वीकृत उत्तर, इसकी टिप्पणियों से जानकारी को जोड़ता है और '$ टोकन आईडी' सेट करने के दस्तावेज तरीके से पूरा करता है –

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