2015-07-09 14 views
6

सारांशLaravel testcase प्राधिकरण नहीं भेज हेडर (जेडब्ल्यूटी टोकन)

हम इकाई परीक्षण लिख रहे हैं निर्माण और जेडब्ल्यूटी टोकन के अमान्यकरण परीक्षण करने के लिए और एक प्राप्त "टोकन अनुरोध से पार्स नहीं किया जा सका" त्रुटि वापस JWTException से हर बार जब हम JWTAuth :: टोकन को अमान्य करते हैं।

विवरण

हमारे नियंत्रक के अंदर, एक उपयोगकर्ता टोकन बनाने के लिए, हम उपयोगकर्ता ईमेल पते के माध्यम से गुजर रहे हैं और फिर जेडब्ल्यूटी टोकन लौटने।

बाद में, हम अवैधकरण टोकन विधि का उपयोग करके इसे अमान्य करके टोकन को नष्ट कर रहे हैं और प्राधिकरण शीर्षलेख भेजकर टोकन से गुज़र रहे हैं।

public function invalidateToken() 
{ 
    try { 
     JWTAuth::invalidate(JWTAuth::getToken()); 
     return Response::json(['status' => 'success'], 200); 
    } catch (JWTException $e) { 
     return Response::json(['status' => 'error', 'message' => $e->getMessage()], 401); 
    } 
} 

यह पोस्टमैन के साथ-साथ PHPStorms आराम क्लाइंट का उपयोग करके पूरी तरह से काम करता है।

जब हम इस विधि के लिए एक परीक्षण लिखने का प्रयास करते हैं, तो हमें एक त्रुटि प्रतिक्रिया का सामना करना पड़ता है और "टोकन अनुरोध से पार्स नहीं किया जा सका" त्रुटि संदेश।

हमारे परीक्षण के रूप में अनुवर्ती है:

public function testInvalidateToken() 
{ 
    $createUserToken = $this->call('POST', '/token/create', ['email' => '[email protected]']); 
    $user = $this->parseJson($createUserToken); 

    $response = $this->call('POST', '/token/invalidate', 
     [/* params */], [/* cookies */], [/* files */], ['HTTP_Authorization' => 'Bearer '.$user->token]); 

    // var_dump($user->token); 
    // die(); 

    $data = $this->parseJson($response); 
    $this->assertEquals($data->status, 'success'); 
    $this->assertEquals($data->status, '200'); 
} 

हम Laravel 5.1

PHP संस्करण (जो सर्वर पैरामीटर से पहले एक पैरामीटर के रूप कुकी होने पर) का उपयोग कर रहे 5.6.10

PHPUnit 3.7 .28

* संपादित करें * PHPUnit 4.7.6 पर अपडेट किया गया और अभी भी विफल रहा है ओ प्राधिकरण शीर्षलेख के माध्यम से भेजें।

* समाधान *
मेरी नियंत्रक __construct विधि में, मैं कोड के इन कुछ पंक्तियों चलाने वाले है और मेरी समस्या हल।

if ((\App::environment() == 'testing') && array_key_exists("HTTP_Authorization", Request::server())) { 
    JWTAuth::setRequest(\Route::getCurrentRequest()); 
} 

उत्तर

3

हम ने वही समस्या का सामना करना पड़ा जब Laravel 4.2 पर परीक्षण लेखन, असाधारण हम जब परीक्षण वातावरण पर आवेदन चल रहा है इस लाइनों कहा:

// This will only work when unit testing 
     if ((\App::environment() == 'testing') && array_key_exists("HTTP_Authorization", LRequest::server())) { 
      $headers['Authorization'] = LRequest::server()["HTTP_Authorization"]; 
     } 
4

मैं नियंत्रक निर्माता में निम्न कोड की कोशिश की:

if (env('APP_ENV') == 'testing' 
     && array_key_exists("HTTP_AUTHORIZATION", request()->server())) { 
    JWTAuth::setRequest(\Route::getCurrentRequest()); 
} 
+0

मैं आपका कोड आज़मा रहा हूं लेकिन \ Route :: getCurrentRequest() शून्य देता है। कोई विचार क्यों हो सकता है? धन्यवाद –

0

हमारे एपीआई को टोकन भेजने के दो तरीके हैं, यदि हेडर काम नहीं कर रहा है तो बस अपने यूआरएल में संलग्न करें। उदाहरण:

http://api.mysite.com/me?token={yourtokenhere} 

तो तुम ऐसा कर सकता है:

अपने testcase में

public function signIn($data=['email'=>'[email protected]', 'password'=>'password']) 
{ 
    $this->post('/auth/signin', $data); 
    $content = json_decode($this->response->getContent()); 

    $this->assertObjectHasAttribute('token', $content, 'Token does not exists'); 
    $this->token = $content->token; 

    return $this; 
} 

यह हड़पने और> $ इस- में एक टोकन संगृहीत कर लेंगे ताकि आप इसे बनाने के लिए उपयोग कर सकते हैं एक अनुरोध

अपने परीक्षण में बाद में

फिर

public function testResticted() 
{ 
    $this->signIn(); 
    $this->call('GET', '/restricted/page', ['token'=>$this->token], $cookies = [], $files = [], $server = []); 
    dump($this->response); 
} 
संबंधित मुद्दे