Cómo crear una API en Laravel 10
en 5 simples pasos usando además Laravel Sanctum para proteger el endpoint
La idea de esta publicación es explicar paso a paso cómo crear una API desde un proyecto nuevo en Laravel que se conecte a una base de datos (previamente requerida con datos en su interior) y que exponga de forma segura una ruta que permita consumir por un usuario definido, el contenido de ésta. Para este ejemplo utilizaremos un proyecto que he realizado que contiene noticias.
Deberemos crear un nuevo proyecto, un usuario que pueda acceder al endpoint expuesto de forma segura (a través de un token) y recibir las noticias en formato JSON.
Los siguientes 5 pasos describen una guía simple para lograrlo
1. Crear el nuevo proyecto en Laravel (lo llamaremos “api-news”)
laravel new api-news
2. Crear un seeder para la tabla usuarios
Este paso es opcional puesto que solo necesitamos un único usuario que pueda acceder. Existen diversos y sofisticados sistemas que proveen formas más elegantes y eficientes que dependen del modelo de negocio, pero esta es una vía simple que nos permitirá cumplir el objetivo.
php artisan make:seeder UserSeeder
2.1 Crear el usuario en el seeder:
Rellena los datos que necesites y asegúrate de tener correctamente configurado el archivo .env
con la información de la DB (base de datos).
public function run(): void
{
User::insert([
[
'name' => 'TU_NOMBRE',
'email' => 'tu@correo.com',
'password' => Hash::make('password')
],
]);
}
2.2 Ajustar la llamada en el archivo database/seeders/DatabaseSeeder.php
public function run(): void
{
$this->call([
UserSeeder::class,
]);
}
Una vez generado, puede poblar tu tabla con el comando:
php artisan migrate — seed
3. Instalar Laravel Sanctum
Laravel provee de una excelente y muy completa documentación la que te invito a revisar en: https://laravel.com/docs/10.x/sanctum
Instala Laravel Sanctum de acuerdo al siguiente comando y recibirás una respuesta, en caso satisfactorio, como la que incluyo:
composer require laravel/sanctum
Luego ejecuta el siguiente comando para publicar la migración
php artisan vendor:publish - provider="Laravel\Sanctum\SanctumServiceProvider"
3.2 Luego genera la migración de la nueva tabla en la base de datos
php artisan migrate
Recibirás el siguiente mensaje:
3.3 Crear un token para la autenticación de la API
Para crear un token para la autenticación de la API, necesitas añadir el HasApiTokens
a tu modelo de Usuario. Esto es útil si quieres manejar a más de un usuario de acuerdo a la lógica de registro/autorización que definas.
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
...
}
El siguiente código lo dejo como ejemplo en el caso que necesites manejar el registro y acceso de tus usuarios. Para este ejemplo no es necesario:
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class AuthController extends Controller
{
public function login(Request $request)
{
$credentials = $request->validate([
'email' => 'required|email',
'password' => 'required',
]);
if (Auth::attempt($credentials)) {
$user = User::where('email', $request->email)->first();
$token = $user->createToken('token-name')->plainTextToken;
return response()->json(['token' => $token], 200);
} else {
return response()->json(['message' => 'Invalid credentials'], 401);
}
}
}
4. Crear el controlador para las noticias (o post) dependiendo de lo que necesites mostrar
php artisan make:controller NewsController
4.1 Escribir la lógica para las noticias. En este caso necesitamos las últimas 50 noticias ordenadas desde la más reciente a la más antigua.
use App\Models\News;
class NewsController extends Controller
{
public function index()
{
$news = News::orderBy('created_at', 'desc')->take(50)->get();
return response()->json($news);
}
}
5. Definir las Rutas y Tokens de la API
5.1 Define las rutas de la API; en este caso el endpoint o ruta será news
. Se deben escribir en el archivo routes/api.php
:
use App\Http\Controllers\NewsController;
Route::middleware('auth:sanctum')->group(function () {
Route::get('/news', [NewsController::class, 'index']);
});
5.2 Generar un token para el usuario del seeder. Este paso es fundamental para obtener el token y luego obtener las noticias de la API
Es factible en este punto generarlo de diversas maneras, pero la aproximación más simple (puesto que solo requerimos de un usuario/token) es vía Tinker
php artisan tinker
5.3 Luego buscamos el usuario con el id = 1
$user = User::find(1);
Lo que nos devolverá un array con los datos. Ahora necesitamos generar el token. Para ello escribimos el siguiente comando:
$token = $user->createToken('api-news')->plainTextToken;
Lo que nos entregará un string similar a este:
= "1|4QyxCYmhZhP35fKbsSYe23mrHRrERzLFuW3tO2x2"
5.4 Copiamos ese token 1|4QyxCYmhZhP35fKbsSYe23mrHRrERzLFuW3tO2x2
y ahora debemos probar que todo funcione. Puedes utilizar postman o simplemente tu terminal.
5.4.1 Probar la API enviando un petición GET a usando cURL
Abre tu terminal y utiliza tus parámetros para generar la llamada. Tu url:https://tuaplicacionLocal.test/news
(o cómo tú hayas decidido nombrar) y el token que recién hemos creado el que debe ir en el encabezado de la Authorization
.
Debiera quedar así el ejemplo en curl
:
curl -H "Authorization: Bearer 1|4QyxCYmhZhP35fKbsSYe23mrHRrERzLFuW3tO2x2" https://tuaplicacionLocal.test/news
5.4.2 Probar la API a través de Postman:
Abre la aplicación de Postman, luego pega la dirección de tu API local, manteniendo la petición como GET:
Luego, haz clic en “Authorization” y luego selecciona “Bearer Token” como se muestra en la siguiente imagen:
Ahora pega el token que hemos generado en el cuadro:
Por último, al presionar sobre “Send”, tu API debierá responder envíandote las noticias o post, o lo que desees (definido en el controlador), con los datos y nombres de columnas definido en tu base de datos, los que podrían verse con una estructura similar a esta:
Si no hay errores… ya estás listo para pasar a producción.
¡Felicitaciones! conseguiste crear una API el Laravel 10
Gracias por tu lectura.
Si te ha gustado, podrías darme un aplauso y seguirme :)