2015-07-09 8 views
6

ZusammenfassungLaravel Testcase nicht zu senden Authorization Header (JWT Token)

Wir Unit-Tests schreiben, die Erstellung und die Entwertung von JWT Token zu testen und ein Empfangsfehler zurück „das Token nicht von der Anforderung analysiert werden konnte“ von einer JWTException jedes Mal, wenn wir versuchen, JWTAuth :: das Token ungültig zu machen.

Beschreibung

In unserem Controller, ein Benutzer-Token zu erstellen, wir durch die Benutzer E-Mail-Adresse sind vorbei und dann die JWT Token zurück.

Danach zerstören wir das Token, indem wir es mit der invalidateToken-Methode ungültig machen und das Token durch Senden eines Authorization-Headers übergeben.

Dies funktioniert perfekt mit Postman sowie PHPStorms Restful Client.

Wenn wir versuchen, einen Test für diese Methode zu schreiben, sehen wir uns mit einer Fehlerantwort und einer Fehlermeldung "Der Token konnte nicht von der Anfrage analysiert werden" konfrontiert.

Unser Test ist wie folgt:

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'); 
} 

Wir verwenden Laravel 5.1 (die die Cookies als Parameter vor dem Server-Parameter hat)

PHP Version 5.6.10

PHPUnit 3.7 .28

* EDIT * Auf PHPUnit 4.7.6 aktualisiert und immer noch fehlgeschlagen t o Senden über Autorisierungsheader.

* SOLUTION *
In meinem Controller __construct Methode, ich habe diese wenigen Zeilen Code, der ausgeführt wird und sortiert mein Problem aus.

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

Antwort

3

Wir haben ein ähnliches Problem konfrontiert, wenn Tests auf Laravel 4.2 Schreiben ausnahmsweise haben wir diese Zeilen, wenn die Anwendung auf der Testumgebung ausgeführt wird:

// 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

ich den folgenden Code in Controller-Konstruktor versucht:

+0

Ich versuche Ihren Code aber \ Route :: getCurrentRequest() gibt null zurück. Irgendeine Idee warum das sein könnte? Danke –

0

Es gibt zwei Möglichkeiten, ein Token an unsere API zu senden. Wenn der Header nicht funktioniert, fügen Sie ihn einfach an Ihre URL an. Beispiel:

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

So könnten Sie dies tun:

In Ihrem 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; 
} 

Dies wird ein Token in $ this- packen und speichern> Token so können Sie es verwenden zu machen eine Anfrage

später dann in Ihren Tests

public function testResticted() 
{ 
    $this->signIn(); 
    $this->call('GET', '/restricted/page', ['token'=>$this->token], $cookies = [], $files = [], $server = []); 
    dump($this->response); 
} 
Verwandte Themen