Saltar al contenido principal

Sanctum y swagger

Introducción

En este caso, la instalación y configuración es similar a la que vimos con JWT. Esto se debe a que estamos utilizando autenticación por token.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\ValidationException;

/**
* @OA\Info(
* title="API de mi aplicación",
* version="1.0.0",
* description="Descripción de mi API",
* termsOfService="https://example.com/terms/",
* @OA\Contact(
* email="contacto@example.com"
* ),
* @OA\License(
* name="MIT",
* url="https://opensource.org/licenses/MIT"
* )
* )
* @OA\Server(url="http://localhost:8000")
* @OA\SecurityScheme(
* securityScheme="bearerAuth",
* type="http",
* scheme="bearer",
* bearerFormat="JWT"
* )
*/
class AuthController extends Controller
{
/**
* Registro de un nuevo usuario.
*/
/**
* @OA\Post(
* path="/api/register",
* operationId="register",
* tags={"Authentication"},
* summary="Registro de un nuevo usuario",
* description="Registro de un nuevo usuario en la aplicación",
* @OA\RequestBody(
* required=true,
* description="Datos del nuevo usuario",
* @OA\JsonContent(
* required={"name","email","password"},
* @OA\Property(property="name", type="string", example="John Doe"),
* @OA\Property(property="email", type="string", format="email", example="john@example.com"),
* @OA\Property(property="password", type="string", format="password", example="password123")
* ),
* ),
* @OA\Response(
* response=200,
* description="Operación exitosa",
* @OA\JsonContent(
* @OA\Property(property="user", type="object"),
* @OA\Property(property="token", type="string")
* )
* ),
* @OA\Response(
* response=422,
* description="Validación fallida",
* @OA\JsonContent(
* @OA\Property(property="errors", type="object")
* )
* )
* )
*/
public function register(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:8',
]);

if ($validator->fails()) {
return response()->json(['errors' => $validator->errors()], 422);
}

$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]);

return response()->json([
'user' => $user,
'token' => $user->createToken('authToken')->plainTextToken
]);
}

/**
* Inicio de sesión y obtención del token.
*/
/**
* @OA\Post(
* path="/api/login",
* operationId="login",
* tags={"Authentication"},
* summary="Inicio de sesión",
* description="Inicia sesión y devuelve el token de autenticación",
* @OA\RequestBody(
* required=true,
* description="Credenciales de inicio de sesión",
* @OA\JsonContent(
* required={"email","password"},
* @OA\Property(property="email", type="string", format="email", example="admin@test.com"),
* @OA\Property(property="password", type="string", format="password", example="admin_password")
* ),
* ),
* @OA\Response(
* response=200,
* description="Operación exitosa",
* @OA\JsonContent(
* @OA\Property(property="user", type="object"),
* @OA\Property(property="token", type="string")
* )
* ),
* @OA\Response(
* response=401,
* description="Credenciales incorrectas"
* ),
* @OA\Response(
* response=422,
* description="Validación fallida",
* @OA\JsonContent(
* @OA\Property(property="errors", type="object")
* )
* )
* )
*/
public function login(Request $request)
{
$validator = Validator::make($request->all(), [
'email' => 'required|email',
'password' => 'required',
]);

if ($validator->fails()) {
return response()->json(['errors' => $validator->errors()], 422);
}

$user = User::where('email', $request->email)->first();

if (!$user || !Hash::check($request->password, $user->password)) {
return response()->json(['errors' => ['email' => ['Las credenciales proporcionadas son incorrectas.']]], 401);
}

return response()->json([
'user' => $user,
'token' => $user->createToken('authToken')->plainTextToken
]);
}

/**
* Refresca el token de autenticación.
*/
/**
* @OA\Post(
* path="/api/refresh",
* operationId="refreshToken",
* tags={"Authentication"},
* summary="Refresca el token de autenticación",
* description="Refresca el token de autenticación del usuario actualmente autenticado",
* security={{"bearerAuth": {}}},
* @OA\Response(
* response=200,
* description="Operación exitosa",
* @OA\JsonContent(
* @OA\Property(property="token", type="string")
* )
* )
* )
*/
public function refresh(Request $request)
{
$user = $request->user();
$user->tokens()->delete();

return response()->json([
'token' => $user->createToken('authToken')->plainTextToken
]);
}

/**
* Cierra la sesión del usuario.
*/
/**
* @OA\Post(
* path="/api/logout",
* operationId="logout",
* tags={"Authentication"},
* summary="Cerrar sesión",
* description="Cerrar sesión del usuario actualmente autenticado",
* security={{"bearerAuth": {}}},
* @OA\Response(
* response=200,
* description="Operación exitosa",
* @OA\JsonContent(
* @OA\Property(property="message", type="string")
* )
* )
* )
*/
public function logout(Request $request)
{
$request->user()->tokens()->delete();

return response()->json(['message' => 'Sesión cerrada correctamente.']);
}
}