Я использую паспорт laravel для аутентификации API, он отлично работает, когда я использую его с одним db, но дает 401
при использовании нескольких баз данных,
Что я делаю:
oauth_clients
sub db будет копировать oauth_clients
выделения пароля и oauth_clients
личного доступа из master db и вставить в sub db, а также вставить client_id
в oauth_personal_access_clients
. Я делаю все процедуры, которые passport:install
command do. (Если я чего-то не упускаю).
Когда я вхожу в систему с учетными данными из master db, он работает отлично, реальная проблема начинается, когда я client_code
из подзадачи, я могу получить sub db из param client_code
который я client_code
с email
, password
при входе в систему.
Это позволяет мне войти в систему из sub db, но я получаю ошибку 401 Unauthenticated
, получаю токен доступа во время входа в систему и 401 Unauthenticated
заголовок Authentication
с Bearer
по каждому запросу после входа в систему с Angular
фронта.
Не знаю, чего мне здесь не хватает.
DBConnection Middleware
Средство DBConnection устанавливает соединение по каждому запросу после входа в систему,
public function handle($request, Closure $next) { if ( $request->method() != 'OPTIONS' ) { $this->access_code = $request->header('access-code'); if ( $this->access_code != '' && $this->access_code != 'sa' ) { app('App\Http\Controllers\Controller')->setDB(AppHelper::DB_PREFIX.$this->access_code); } else { app('App\Http\Controllers\Controller')->setDB(AppHelper::DB_DEFAULT); } } return $next($request); }
DBConnection
устанавливает db database.php
в database.php
динамически, для этого я setDB
метод setDB
созданный на Controller.php
setDB Controller.php
public function setDB($database='') { $config = app()->make('config'); $connections = $config->get('database.connections'); $default_connection = $connections[$config->get('database.default')]; $new_connection = $default_connection; $new_connection['database'] = $database; $config->set('database.connections.'.$database, $new_connection); $config->set('database.default', $database); }
Можно ли использовать passport
с 2 различными db для того же кода?
Laravel 5.4
Passport 4.0
Angular 4.4
в интерфейсе
Чтобы ответить на ваш вопрос: да, вы можете!
В нашем промежуточном программном обеспечении мы делаем следующее:
config([ 'database.connections.tenant.schema' => $tenant ]); DB::connection('tenant')->statement("SET search_path = $tenant");
Мне действительно кажется, что ваш search_path не настроен должным образом. Это объясняет, почему вы получаете 401 . Поскольку Laravel Passport выполняет поиск в неправильной базе данных, в которой он не может найти правильный токен в вашей таблице пользователей.
Из документов PostgreSQL ( https://www.postgresql.org/docs/9.1/static/runtime-config-client.html ):
search_path (строка)
Эта переменная указывает порядок поиска схем, когда объект (таблица, тип данных, функция и т. Д.) Ссылается на простое имя без указанной схемы. Когда в разных схемах есть объекты одинаковых имен, используется первая, найденная в пути поиска. Объект, который не находится ни в одной из схем в пути поиска, может ссылаться только на указание его содержащей схемы с квалифицированным (пунктирным) именем.