【发布时间】:2020-04-11 05:04:08
【问题描述】:
所以我正在尝试为我们的新身份验证服务器在 Lumen 上实现 Passport 编写一些单元/功能测试。但是,我遇到了很多烦人的问题,我什至不确定我是否会以正确的方式做这件事。
当前在 Lumen 中设置护照的方式,特别是对于 Web 请求,我们伪造对 Passport 的内部请求,并将客户端 ID 和机密存储在后端的 env 文件中。 (客户端密码是硬编码在 .env 中的,所以它总是通过每台开发机器上的播种机使用相同的 ID 和密码创建)下面是代码:
class PassportOauth
{
const OAUTH_LOGIN = '/api/v1/oauth/token';
/**
* Functions to encapsulate the token request (login) needs
* */
public static function login($username, $password)
{
return self::clientLogin($username, $password, env('CLIENT_ID'), env('CLIENT_SECRET'));
}
public static function clientLogin($username, $password, $clientID, $clientSecret)
{
return self::post(self::OAUTH_LOGIN, [
'grant_type' => 'password',
'client_id' => $clientID,
'client_secret' => $clientSecret,
'username' => $username,
'password' => $password
]);
}
private static function post($url, $data)
{
return app()->handle(Request::create($url, 'POST', $data));
}
}
无论如何,这个类在我们的开发环境中非常棒。它处理请求并按预期分发访问令牌/刷新令牌。
但是,当我运行单元测试测试这个类时,我不断收到错误“不支持授予类型”,尽管单元测试数据库中存在密码客户端并且所有环境变量都存在。
因此,我已经切换到而不是测试 PassportOauth 类,而是在单元测试中使用 $this->call() 来伪造对 Passport 的调用:
private function doLogin($email, $password)
{
return json_decode($this->call('POST', self::OAUTH_LOGIN, [
'grant_type' => 'password',
'client_id' => env('CLIENT_ID'),
'client_secret' => env('CLIENT_SECRET'),
'username' => $email,
'password' => $password
])->getContent());
}
这对开发很有用!单元测试通过和一切。但是,当它们在我们的 ci/cd 管道中运行并运行单元测试时,我收到未安装 oauth 公钥/私钥的错误。这很明显,我只需要运行passport:install 对吗?
问题是,当时没有在管道中创建护照数据库表。而且我不确定每次运行 ci/cd 管道时是否要添加创建数据库迁移。
所以我的问题是:
1) 我是否以正确的方式接近这一点?如果我是,我如何绕过我什至不需要的 oauth 私钥/公钥,因为我已经从我的 env 文件中的硬编码值静态创建了密码客户端?
2) 是否有更好的方法对此进行单元测试?到目前为止,我的做法让我很伤心。
【问题讨论】:
标签: php unit-testing oauth lumen laravel-passport