Паспорт Laravel дает ошибку 401 Unauthenticated

Я использую паспорт laravel для аутентификации API, он отлично работает, когда я использую его с одним db, но дает 401 при использовании нескольких баз данных,

Что я делаю:

  • У меня есть multi-tenant db, master db имеют пользователей, роли и все таблицы oauth.
  • Когда я создаю пользователя с ролью администратора, он создаст новый db с именем администратора, он создаст sub db с пользователями, ролями и всей oauth-таблицей. 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 в интерфейсе

Solutions Collecting From Web of "Паспорт Laravel дает ошибку 401 Unauthenticated"

Чтобы ответить на ваш вопрос: да, вы можете!

В нашем промежуточном программном обеспечении мы делаем следующее:

 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 (строка)

Эта переменная указывает порядок поиска схем, когда объект (таблица, тип данных, функция и т. Д.) Ссылается на простое имя без указанной схемы. Когда в разных схемах есть объекты одинаковых имен, используется первая, найденная в пути поиска. Объект, который не находится ни в одной из схем в пути поиска, может ссылаться только на указание его содержащей схемы с квалифицированным (пунктирным) именем.