在Laravel中的多租户设置下如何使用护照(Passport)

3

前提条件:

  1. Laravel版本:5.7
  2. Hyn/Multi-tenant Package 5.3
  3. Laravel Passport

我有一个使用Passport进行身份验证的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_idservices.passport.client_secret

它们是为后端的单个实例生成的。但当我设置多租户时,每个租户都会有自己独立的client_idclient_secret

所以,我想要的工作流程基本上是这样的:

  1. 作为管理员,我为租户注册一个新的后端实例
  2. hyn\multi-tenant包将为新的租户创建一个数据库
  3. 该租户的新数据库将包含访问令牌和客户端密钥

到此为止已经完成并且已经运行良好,下面是我想要理解的部分

  1. 我的前端具有完全独立的代码库,通过API与后端通信。
    1. 因此,属于租户实例的前端用户将尝试使用我上面展示的login控制器登录,但我发帖的重点和我的问题是如何根据用户\租户数据库动态调用client_idclient_secret

我知道这可能是很多内容,但如果有任何想法,请告诉我。提前感谢您的帮助!

1个回答

4

首先要做的是创建一个与您的租户连接相关联的自定义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;}

创建完这个类之后,我们需要告诉passport使用我们自己的实现。只需在你的AuthServiceProvider文件中添加以下行即可。
Passport::useClientModel(PassportClient::class);
Passport::useTokenModel(PassportToken::class);
Passport::useAuthCodeModel(PassportAuthCode::class);
Passport::usePersonalAccessClientModel(PassportPersonalAccessClient::class);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接