php - restful - logout api laravel passport
Laravel pasaporte da 401 error no autenticado (2)
Estoy usando el pasaporte Laravel para la autenticación API, funciona perfectamente cuando lo uso con una base de datos, pero da 401
cuando se usan varias bases de datos,
Que estoy haciendo:
- Tengo una base de datos multiusuario, la base de datos maestra tiene usuarios, roles y todas las tablas de OAuth.
- Cuando creo un usuario con rol de administrador, creará una nueva base de datos con el nombre de administrador, creará sub DB con usuarios, roles y todas las tablas de OAuth.
oauth_clients
of sub DB copiará el token de concesión de contraseña y el token de acceso personal de la base de datos maestra e insertará en el sub DB, e insertará tambiénclient_id
enoauth_personal_access_clients
. Estoy haciendo todos los procedimientos que pasa el
passport:install
comando depassport:install
. (Si no me falta algo).Cuando inicio sesión con las credenciales de la base de datos maestra funciona perfectamente, el verdadero problema comienza cuando inicio sesión con las credenciales de la subbase de datos, puedo obtener una base de datos secundaria de un código de
client_code
param que ingrese con elemail
, lapassword
al iniciar sesión.Me permite iniciar sesión desde la base de datos secundaria, pero obtengo
401 Unauthenticated
Error401 Unauthenticated
, obtengo el token de acceso al iniciar sesión y paso el encabezado deAuthentication
con elBearer
en cada solicitud después de iniciar sesión desde el frente deAngular
.No sé lo que me estoy perdiendo aquí.
DBConnection Middleware
El middleware DBConnection establece la conexión en cada solicitud después de iniciar sesión,
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
establece el DB predeterminado en database.php
dinámicamente, para eso, estoy llamando setDB
método setDB
creado en 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);
}
¿Es posible usar el passport
con 2 bases de datos diferentes para el mismo código?
Laravel 5.4
Passport 4.0
Angular 4.4
en la parte delantera
Este es un problema de CORS. La solicitud de OPCIONES no entrega encabezados de Autorización.
Si el origen es diferente del host, el navegador enviará OPCIONES antes de cualquier otra solicitud.
Laravel responderá con el estado 401 si el middleware CORS no está configurado.
Por lo tanto, con la arquitectura REST, si el host de la aplicación cliente es diferente del host de la API, tiene que usar el middleware CORS.
Puedes usar este: barryvdh/laravel-cors
$ composer require barryvdh/laravel-cors
Ejemplo:
App / Http / Kernel.php
protected $routeMiddleware = [
...
''auth.cors'' => /Barryvdh/Cors/HandleCors::class,
...
];
web.php
Route::group([
''prefix'' => ''api'',
''middleware'' => [
''auth.cors''
]
], function () {
Route::post(''user/authenticate'', ''UserController@authenticate'');
});
Si el middleware CORS funciona correctamente, un navegador recibirá el estado 200 en la solicitud de OPCIONES y disparará la solicitud inicial con una carga útil.
Para responder a tu pregunta: ¡Sí, puedes!
En nuestro middleware hacemos algo así:
config([
''database.connections.tenant.schema'' => $tenant
]);
DB::connection(''tenant'')->statement("SET search_path = $tenant");
Realmente me suena que tu search_path no está configurada correctamente. Esto explicaría por qué obtienes un 401 . Porque Laravel Passport está buscando en la base de datos incorrecta en la que no puede encontrar el token correcto en la tabla de usuarios.
De los documentos de PostgreSQL ( https://www.postgresql.org/docs/9.1/static/runtime-config-client.html ):
search_path (cadena)
Esta variable especifica el orden en el que se buscan los esquemas cuando se hace referencia a un objeto (tabla, tipo de datos, función, etc.) con un nombre simple sin esquema especificado. Cuando hay objetos con nombres idénticos en diferentes esquemas, se usa el que se encuentra primero en la ruta de búsqueda. Solo se puede hacer referencia a un objeto que no se encuentra en ninguno de los esquemas en la ruta de búsqueda especificando su esquema que contiene con un nombre calificado (punteado).