Tengo una aplicación laravel con un sistema de inicio de sesión, solo para pasantes y tengo un sitio web que obtiene y publica datos desde/hacia la aplicación laravel con una API
Así que quiero que solo mi sitio web pueda obtener/publicar datos desde/hacia la aplicación api -> laravel
Por ahora, he creado un usuario de inicio de sesión para la API con correo electrónico y contraseña. Sé que esa no es la manera correcta de hacerlo.
Y con estas credenciales de inicio de sesión, el sitio web obtiene un token de portador de la API (caducidad 10 min)
Con este token de portador (encabezado de llamada ajax), el sitio web llama a cada solicitud de API (obtener/publicar)
Llamada Ajax para obtener el token de portador:
axios.post(data_source_url + "/auth/token", {'email' : 'api@email.de', 'password' : 'pw1'}).then((res) => { document.cookie = 'bearer=' + res.data + ';expires=' ... })Rutas API de Laravel:
Route::post('/auth/token', ['uses'=>'ApiController@getToken'])->name('api.getToken'); Route::get('/get', ['middleware'=>'auth:sanctum', 'uses'=>'Api\ApiController@read']); Route::post('/send', ['middleware'=>'auth:sanctum', 'uses'=>'Api\ApiController@send']);así que me gustaría dejarlo así con autorización con un token de portador, pero cómo enviar y recibir un token de portador de la API de la manera correcta/ segura , porque la forma en que lo hago ahora con el inicio de sesión es totalmente insegura
No debes dejar abierta tu ruta para conseguir el token. He escrito un artículo sobre este tema API REST de Laravel 8. Este enfoque le permite obtener un token al iniciar sesión primero con un usuario válido en la aplicación. Para su caso de uso, simplemente elimine la ruta de registro y el controlador, y podrá asegurarlo solo para su uso.
Ruta
Route::post('/login', [ApiController::class, 'login']);Controlador
public function login(Request $request) { if (!Auth::attempt($request->only('email', 'password'))) { return response()->json(['message' => 'Incorrect e-mail or password'], 401); } $user = User::where('email', $request['email'])->firstOrFail(); $token = $user->createToken('auth_token')->plainTextToken; return response()->json([ 'access_token' => $token, 'token_type' => 'Bearer', ]); }Me acabo de dar cuenta de que estás iniciando sesión para recuperar el portador. Relájese, los encabezados están encriptados usando HTTPS, por lo que es seguro hasta donde yo sé.
Para eliminar el usuario y la contraseña de texto sin formato en la llamada js, debe instalar dotenv emitiendo npm install dotenv --save
Ahora agregue a su archivo .env
MY_API_USER=api@email.de MY_API_PASSWORD=pw1Entonces necesitas agregar a tu archivo
require('dotenv').config();Entonces puede usar los datos confidenciales de esta manera
axios.post(data_source_url + "/auth/token", {'email' : process.env.MY_API_USER, 'password' : process.env.MY_API_USER}).then((res) => { document.cookie = 'bearer=' + res.data + ';expires=' ... }) No compartirá su archivo .env y asegúrese de agregarlo a su .gitignore o similar, si no está allí.