测试基本认证

时间:2015-08-11 21:58:26

标签: php unit-testing laravel-5 phpunit basic-authentication

我想测试我的基本身份验证页面。 取消授权的测试工作正常。但我在授权登录方面很费劲,因为我不知道如何在测试中设置标头。

我找不到提示,如何在$this->call()上设置标题。我能找到的唯一信息是:

$this->call($method, $uri, $parameters, $cookies, $files, $server, $content);

并且缺少标头。

如何在laravel上轻松测试基本身份验证。具体:如何为测试请求设置基本的auth标头?

我现在有什么:

class ExampleTest extends TestCase {
    public function test401UnauthorizedOnMe() { 
        $response = $this->call('GET', '/api/me');
        $this->assertResponseStatus( 401);
    }

    public function testCorrectLoginOnMe() { 
        // http://shortrecipes.blogspot.de/2009/12/testing-basic-http-authentication-using.html
        //send header with correct user and password i.e.
        ////YWRtaW46YWRtaW4xMg== is equal to base64_encode( "admin:admin12")
        $this->request->setHeader( 'Authorization','Basic YWRtaW46YWRtaW4xMg==');
        $response = $this->call('GET', '/api/me');
        $this->assertResponseStatus(200);
    }
}

我尝试了$this->$request->setHeader();但是这样我才会收到错误:

1) ExampleTest::testCorrectLoginOnMe
ErrorException: Undefined property: ExampleTest::$request

3 个答案:

答案 0 :(得分:1)

基本身份验证通常使用“授权”的标题键来实现。为方便起见,我在我的基本 TestCase 类中有以下方法:

protected function withBasicAuth(User $user, $password = 'password'): self
{
    return $this->withHeaders([
        'Authorization' => 'Basic '. base64_encode("{$user->email}:{$password}")
    ]);
}

然后在我的任何测试用例中,我都可以使用通过基本身份验证进行身份验证的用户运行 HTTP 测试,如下所示:

$user = User::factory()->create();
$this->withBasicAuth($user)
    ->get('/');
    ->assertStatus(Response::HTTP_OK);

注意:出厂时创建的用户的默认密码是“password”。

答案 1 :(得分:0)

    $encoded_details = base64_encode('admin:admin12')
    $headers =  [
        'HTTP_Authorization' => 'Basic '. $encided_details
    ];
    $response = $this->withHeaders($headers)->json('GET', '/api/me');

只是另一个对我有用的解决方案

答案 2 :(得分:0)

protected function basicAuthenticate($detailsEncoded, $user, $password): self
{
    $_SERVER['HTTP_AUTHORIZATION'] = $detailsEncoded;
    $_SERVER['PHP_AUTH_USER'] = $user;
    $_SERVER['PHP_AUTH_PW'] = $password;

    return $this;
}


$response = $this->basicAuthenticate($detailsEncoded, $user, $password)->get($url);
$response->assertStatus(200);