Estoy haciendo un proyecto para API usando el paquete Sanctum laravel. Necesita conectar 2 servidores de base de datos. Uno es MySQL para guardar algunos datos, incluido el usuario de inicio de sesión. Otro es SQL Server para obtener datos para la ruta API. No hay ningún problema al iniciar sesión en Sanctum en el servidor de base de datos MySQL que probé bien y recuperé el token. También la recuperación de datos de SQL Server funciona bien cuando recupero datos sin usar Laravel Sanctum.
Necesito iniciar sesión en el servidor de base de datos MySQL y recuperar datos del servidor de base de datos SQL Server. El problema al que me enfrento ahora es cómo y dónde definir la necesidad del servidor de base de datos MySQL para el middleware de autenticación de Sanctum.
Las conexiones son las siguientes:
DB_MYSQL_CONNECTION=mysql DB_MYSQL_HOST=127.0.0.1 DB_MYSQL_PORT=3306 DB_MYSQL_DATABASE=api DB_MYSQL_USERNAME=root DB_MYSQL_PASSWORD= DB_SQLSRV_CONNECTION=sqlsrv DB_SQLSRV_HOST=127.0.0.1 DB_SQLSRV_PORT=1433 DB_SQLSRV_DATABASE=StoreData DB_SQLSRV_USERNAME=sa DB_SQLSRV_PASSWORD=por esa ruta
Route::middleware(['auth:sanctum'])->group(function () { Route::get('/items', 'APIController@getAllItems'); });Lo ejecuto con el token de autenticación después de registrar el éxito, obtuve el siguiente error:
Illuminate\Database\QueryException: SQLSTATE[42S02]: [Microsoft][Controlador ODBC 11 para SQL Server][SQL Server]Nombre de objeto no válido 'personal_access_tokens'. (SQL: seleccione top 1 * de [personal_access_tokens] donde [token] = bd1de1df8bc2ac289dbd89f7d640a4c65ebc1b709b565ee500315ee710f12b62) en el archivo ...\vendor\laravel\framework\src\Illuminate\Database\Connection.php en la línea 671
personal_access_tokens y las tablas de usuarios están en la base de datos MySQL. ¿Puedo personalizar qué conexión de db es para Sanctum Auth? ¿y cómo?
Bueno, necesitas algo de personalización para el token de acceso personal. cree un modelo normal con el nombre de SanctumPersonalAccessClient (lo que quiera en este ejemplo) y en AuthServiceProvider.php escriba esto
namespace App\Providers; use Laravel\Sanctum\Sanctum; use App\SanctumPersonalAccessClient as PersonalAccessClient; class AuthServiceProvider extends ServiceProvider { /** * The policy mappings for the application. * * @var array */ protected $policies = [ // ]; /** * Register any authentication / authorization services. * * @return void */ public function boot() { $this->registerPolicies(); Sanctum::usePersonalAccessClientModel(PersonalAccessClient::class); } }luego, en su modelo que acaba de crear, simplemente configure la conexión y el nombre de la tabla de esta manera:
namespace App; use Laravel\Sanctum\PersonalAccessClient; class SanctumPersonalAccessClient extends PersonalAccessClient { protected $connection = 'my_custom_connection'; protected $table = 'personal_access_tokens'; }enlace útil pero con pasaporte: https://github.com/laravel/passport/issues/247#issuecomment-424095961