php - tutorial - Laravel pasaporte da 401 error no autenticado




personal access client not found. please create one. (2)

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', '[email protected]');
});

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.

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én client_id en oauth_personal_access_clients .
  • Estoy haciendo todos los procedimientos que pasa el passport:install comando de passport: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 el email , la password al iniciar sesión.

  • Me permite iniciar sesión desde la base de datos secundaria, pero obtengo 401 Unauthenticated Error 401 Unauthenticated , obtengo el token de acceso al iniciar sesión y paso el encabezado de Authentication con el Bearer en cada solicitud después de iniciar sesión desde el frente de Angular .

  • 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


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).