Как динамически запрашивать токен доступа, используя Passport и Laravel - PullRequest
0 голосов
/ 14 декабря 2018

Я работаю с мультитенантной настройкой и ищу способ, которым, когда я пытаюсь запросить токены доступа, я могу отправить запрос в правильную конечную точку входа.

Например, в одномклиент, настроенный, когда я делаю запрос на access_token, будет выглядеть примерно так

$http = new \GuzzleHttp\Client;

    try {
        $response = $http->post('http://mydomain.test/oauth/token', [
            'form_params' => [
                'grant_type' => 'password',
                'client_id' => env('CLIENT_ID'),
                'client_secret' => env('CLIENT_SECRET'),
                'username' => $request->username,
                'password' => $request->password,
                ]
                ]);

                return response()->getBody();
            }

Теперь я пытаюсь сделать так, чтобы конечная точка входа в систему $ http-> post (мой url) измениласьв зависимости от того, какой пользователь-арендатор делает запрос.

Поэтому в настоящее время, когда я отправляю запрос на запись в контроллер входа в систему, я обертываю маршрут в промежуточное ПО, например

Route::group(['middleware' => 'tenancy.enforce'], function () {
    Route::post('/login', 'PassportTokenController@login');
});

, а затем вмой контроллер, я могу вызвать секретный ключ клиента и fqdn, основываясь на запросе арендатором информации

. Поэтому, когда я запрашиваю fqdn выполняемого запроса и client_secret из базы данных арендатора, я получаю правильныйdata

$passport = DB::table('oauth_clients')->where('id', 2)->first(); 

$hostname  = app(\Hyn\Tenancy\Environment::class)->hostname();

теперь, если я вставлю эти переменные в метод входа в систему, я получу внутреннюю 500-ю ошибку сервера

public function login(Request $request)
    {
        $passport = DB::table('oauth_clients')->where('id', 2)->first(); 

        $hostname  = app(\Hyn\Tenancy\Environment::class)->hostname();

        $http = new \GuzzleHttp\Client;

        try {
            $response = $http->post('http://' . $hostname->fqdn . '/oauth/token', [
                'form_params' => [
                    'grant_type' => 'password',
                    'client_id' => 2,
                    'client_secret' => $passport->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());
        }

    }

Уведомление tон $http->post(my url) изменяется в зависимости от того, какой пользователь-арендатор делает запрос.

Есть ли что-то с паспортом, что я должен сделать, чтобы я мог динамически сделать запрос на токен доступа oauth?

*Обновите, так что после выяснения, как получить реальный ответ об ошибке сервера, я замечаю, что http-сервер Guzzle пытается запросить системную базу данных вместо базы данных клиентов

Base table or view not found: 1146 Table 'multitenant-diy.oauth_clients' doesn't exist (SQL: select * f (truncated...)
 in C:\laragon\www\multitenant-diy\vendor\guzzlehttp\guzzle\src\Exception\RequestException.php:113
...