先决条件:
所以我有一个Laravel应用程序已经在使用护照进行身份验证。现在,当前用户登录时,我使用以下控制器授权用户并授予访问令牌
public function login(Request $request)
{
$http = new \GuzzleHttp\Client;
try {
$response = $http->post(config('services.passport.login_endpoint'), [
'form_params' => [
'grant_type' => 'password',
'client_id' => config('services.passport.client_id'),
'client_secret' => config('services.passport.client_secret'),
'username' => $request->username,
'password' => $request->password,
]
]);
return $response->getBody();
} catch (\GuzzleHttp\Exception\BadResponseException $e) {
if ($e->getCode() === 400) {
return response()->json('Invalid Request. Please enter a username or a password.', $e->getCode());
} else if ($e->getCode() === 401) {
return response()->json('Your credentials are incorrect. Please try again', $e->getCode());
}
return response()->json('Something went wrong on the server.', $e->getCode());
}
}
但是,有些事情是硬编码的,因此对于多租户设置来说是行不通的。
services.passport.client_id
和services.passport.client_secret
它们是为后端的单个实例生成的。但是,当我设置多租户时,每个租户将有单独的client_id
和client_secret
。
所以我想要的工作流程基本上是这样的
至此已完成并且已经起作用,下面是我要理解的部分
login
控制器进行登录,但是我的帖子的重点和问题是我根据用户\租户数据库动态调用client_id
和client_secret
? 我知道这可能要消化很多,但是如果有人有想法,我会全神贯注。预先谢谢你!
答案 0 :(得分:2)
要做的第一件事是创建一个自定义的PassportClient,PassportAuthCode,PassportPersonalAccessClient,PassportToken模型,该模型连接到您的租户连接
use Hyn\Tenancy\Traits\UsesTenantConnection;
use Laravel\Passport\AuthCode;
class PassportAuthCode extends AuthCode
{use UsesTenantConnection;}
use Hyn\Tenancy\Traits\UsesTenantConnection;
use Laravel\Passport\Client;
class PassportClient extends Client
{use UsesTenantConnection;}
use Hyn\Tenancy\Traits\UsesTenantConnection;
use Laravel\Passport\PersonalAccessClient;
class PassportPersonalAccessClient extends PersonalAccessClient
{use UsesTenantConnection;}
use Hyn\Tenancy\Traits\UsesTenantConnection;
use Laravel\Passport\Token;
class PassportToken extends Token
{use UsesTenantConnection;}
创建此类后,我们需要告诉护照使用我们的自定义实现。只需将以下行添加到您的AuthServiceProvider文件中
Passport::useClientModel(PassportClient::class);
Passport::useTokenModel(PassportToken::class);
Passport::useAuthCodeModel(PassportAuthCode::class);
Passport::usePersonalAccessClientModel(PassportPersonalAccessClient::class);