Creación de una API Laravel segura con autenticación JWT
Cuando se construyen APIs con Laravel, garantizar una autenticación segura es crucial, especialmente cuando se trata de datos de usuario. Los JSON Web Tokens (JWT) ofrecen un método robusto para manejar la autenticación en aplicaciones sin estado, permitiendo la transmisión segura de información de usuario entre las partes. Esta guía le guiará a través del proceso de construcción de una API Laravel segura utilizando la autenticación JWT.
Requisitos previos
- Conocimientos básicos de PHP y Laravel.
- Laravel instalado en su máquina (preferiblemente Laravel 9 o más reciente).
- Composer instalado.
- MySQL u otra base de datos configurada para tu aplicación.
Paso 1: Crear un nuevo proyecto Laravel
Primero, crea un nuevo proyecto Laravel usando Composer:
composer create-project laravel/laravel laravel-jwt-api
Navega hasta el directorio de tu proyecto:
cd laravel-jwt-api
Paso 2: Instalar el paquete de autenticación JWT
El paquete más utilizado para la autenticación JWT en Laravel es tymon/jwt-auth
composer require tymon/jwt-auth
Tras la instalación del paquete, publica la configuración JWT:
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
Esto creará un archivo
config/jwt.php
Paso 3: Generar la clave secreta JWT
Generar una clave secreta que JWT utilizará para firmar tokens:
php artisan jwt:secret
Esto añadirá una entrada
JWT_SECRET
.env
Paso 4: Configurar la autenticación
Para configurar la autenticación JWT, necesita configurar la guardia por defecto para su API. Actualice el archivo
config/auth.
'defaults' => [
'guard' => 'api',
'passwords' => 'users',
],
‘guards’ => [api’ => [
‘driver’ => ‘jwt’,
‘provider’ => ‘users’,
],
],
Esto le dice a Laravel que use el driver
jwt
users
Paso 5: Crear el modelo de usuario y la migración
Si aún no has creado un modelo de
usuario
php artisan make:model Usuario -m
Abra el archivo de migración generado en
database/migrations/
nombre
email
contraseña
public function up()
{
Schema::create('usuarios', function (Blueprint $tabla) {
$table->id();
$table->cadena('nombre');
$table->string('email')->único();
$table->string('contraseña');
$table->timestamps();
});
}
Ejecuta la migración para crear la tabla de
usuarios
php artisan migrate
Paso 6: Implementar métodos JWT en el modelo de usuario
En el modelo de
Usuario
(app/Models/User.php
JWTSubject
use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements JWTSubject{
función pública getJWTIdentifier()
{
return $this->getKey();
}
public function getJWTCustomClaims(){
return [];
}
}
Paso 7: Crear controladores de autenticación
Cree un controlador para gestionar la autenticación de usuarios:
php artisan make:controller AuthController
En
AuthController.php
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Tymon\JWTAuth\Facades\JWTAuth;
class AuthController extends Controller{
public function registrar(Solicitud $petición)
{
$petición->validar([
‘name’ => ‘required|string|max:255’,
’email’ => ‘required|string|email|max:255|unique:users’,
‘password’ => ‘required|string|min:6|confirmed’,
]);
$user = User::create([‘nombre’ => $solicitud->nombre,
’email’ => $request->email,
‘contraseña’ => Hash::make($solicitud->contraseña),
]);
$token = JWTAuth::fromUser($usuario);return response()->json([‘token’ => $token], 201);
}
public function login(Petición $petición)
{
$credentials = $request->only(’email’, ‘password’);
if (!$token = Auth::attempt($credentials)) {
return response()->json([‘error’ => ‘Credenciales no válidas’], 401);
}
return response()->json([‘token’ => $token]);
}
función pública logout()
{
Auth::logout();
return response()->json([‘message’ => ‘Successfully logged out’]);
}
public function me()
{
return response()->json(Auth::user());
}
}
Paso 8: Definir rutas API
Añadir rutas para la autenticación en
routes/api.php
use App\Http\Controllers\AuthController;
Route::post(‘registrar’,[AuthController::class, ‘registrar’]);
Route::post(‘iniciar sesión’,[AuthController::class, ‘iniciar sesión’]);
Route::post(‘logout’,[AuthController::class, ‘logout’])->middleware(‘auth:api‘);
Route::get(‘me’,[AuthController::class, ‘me’])->middleware(‘auth:api‘);
Estas rutas gestionan el registro de usuarios, el inicio de sesión, el cierre de sesión y la obtención del usuario autenticado.
Paso 9: Proteger las rutas API
Para proteger otras rutas API, puede utilizar el middleware
auth:api
entradas
Route::middleware('auth:api')->group(function () {
Route::resource('posts', PostController::class);
});
Esto asegura que sólo los usuarios autenticados pueden acceder a estas rutas.
Paso 10: Probar la API
Puede probar su API utilizando herramientas como Postman o cURL.
- Registre un usuario:
POST /api/register
Content-Type: application/json{
“nombre”: “John Doe”,
“email”: “john@example.com”,
“password”: “password”,
“password_confirmation”: “password”
} - Iniciar sesión:
POST /api/login
Content-Type: application/json{
“email”: “john@example.com”,
“password”: “password”
}Esto devolverá un token que podrás utilizar para autenticar otras peticiones.
- Acceder a una ruta protegida:Para acceder a una ruta protegida como, incluye el token en la cabecera
GET /api/me
:Authorization
Authorization: Bearer
Paso 11: Actualización de tokens JWT (opcional)
Para actualizar un token, puede añadir un método en
AuthController
public function refresh()
{
$token = Auth::refresh();
return response()->json(['token' => $token]);
}
Añade la ruta para refrescar:
Route::post('refresh', [AuthController::class, 'refresh'])->middleware('auth:api');
Conclusión
Siguiendo esta guía, has construido una API Laravel segura con autenticación JWT, permitiendo el registro de usuarios, login y acceso a rutas protegidas. JWT te permite mantener un mecanismo de autenticación sin estado, lo que es especialmente útil para escalar APIs. Con esta configuración, puedes personalizar aún más la lógica de autenticación de tu aplicación e integrar características adicionales, como el control de acceso basado en roles y tokens de actualización para sesiones de larga duración.