测试基本授权
Test basic auth
我想测试我的基本授权保护页面。 unauthorization 的测试工作正常。但是我在授权登录上遇到了困难,因为我不知道如何在测试中设置 headers。
我找不到提示,如何在 $this->call()
上设置 headers。我能找到的唯一信息是:
$this->call($method, $uri, $parameters, $cookies, $files, $server, $content);
并且缺少 header。
如何在 laravel 上轻松测试基本身份验证。具体:如何为测试请求设置基本授权header?
我目前拥有的:
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
找到 HTTP authentication with PHP 的解决方案。这个可以用在$this->call()
的$server
参数中。
这是我的工作函数:
public function testCorrectLoginOnMe() {
// call( $method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null)
$this->call('GET', '/api/me', [], [], [], ['PHP_AUTH_USER' => 'admin', 'PHP_AUTH_PW' => 'admin12']);
$this->assertResponseStatus( 200 );
}
$encoded_details = base64_encode('admin:admin12');
$headers = [
'HTTP_Authorization' => 'Basic '. $encoded_details
];
$response = $this->withHeaders($headers)->json('GET', '/api/me');
另一个对我有用的解决方案
基本身份验证通常使用 'Authorization' 的 header 密钥来实现。为了方便起见,我的基本 TestCase class:
中有以下方法
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'。
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);
我想测试我的基本授权保护页面。 unauthorization 的测试工作正常。但是我在授权登录上遇到了困难,因为我不知道如何在测试中设置 headers。
我找不到提示,如何在 $this->call()
上设置 headers。我能找到的唯一信息是:
$this->call($method, $uri, $parameters, $cookies, $files, $server, $content);
并且缺少 header。
如何在 laravel 上轻松测试基本身份验证。具体:如何为测试请求设置基本授权header?
我目前拥有的:
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
找到 HTTP authentication with PHP 的解决方案。这个可以用在$this->call()
的$server
参数中。
这是我的工作函数:
public function testCorrectLoginOnMe() {
// call( $method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null)
$this->call('GET', '/api/me', [], [], [], ['PHP_AUTH_USER' => 'admin', 'PHP_AUTH_PW' => 'admin12']);
$this->assertResponseStatus( 200 );
}
$encoded_details = base64_encode('admin:admin12');
$headers = [
'HTTP_Authorization' => 'Basic '. $encoded_details
];
$response = $this->withHeaders($headers)->json('GET', '/api/me');
另一个对我有用的解决方案
基本身份验证通常使用 'Authorization' 的 header 密钥来实现。为了方便起见,我的基本 TestCase class:
中有以下方法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'。
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);