Sitemap

Cómo crear una API en Laravel 10

en 5 simples pasos usando además Laravel Sanctum para proteger el endpoint

5 min readMar 10, 2023
cómo crear una API en Laravel 10 utilizando 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 :)

--

--

Claudio Vallejo
Claudio Vallejo

Written by Claudio Vallejo

Wine, programmer, diver & photographer lover. Agronomist Engineer. CEO/Founder of Intelvid.la — Cofounder Eziviu.com More: cvallejo.me

Responses (2)