Ir al contenido principal

Destacados

Ubuntu 25.04 instalación y configuración inicial

 Probamos Ubuntu 25.04 - Muy rápido y confiable !!

Como hacer una API REST PHP segura en Laravel 8 con Sanctum Auth registro y login y generación de token


 

Por fin vas ha hacerlo bien!!!

Bienvenido hoy vamos a trabajar en la creación de una api rest full con registro y login más emisión de token para la autentificación de usuarios y que ellos puedan escribir en un blog que también sera capaz de hacer el crud de registros del blog, todo en 35 minutos, más no se puede pedir!!

También, te explicaremos paso a paso cómo probar la REST API de autenticación de Laravel 8 Sanctum usando la herramienta de prueba Postman.

Laravel Sanctum ofrece un sistema de autenticación impecable, seguro, increíblemente rápido y liviano para aplicaciones de una sola página (SPA), aplicaciones móviles y API simples basadas en token.

Por fin algo que funciona!!!

Cree una API REST PHP segura en Laravel 8 con Sanctum Auth
Ultima actualización en: 31 de enero de 2022 por Digamber

Tutorial de autenticación de Laravel 8 Sanctum; En este tutorial, compartiremos cómo crear o construir una API RESTful PHP segura en la aplicación Laravel 8 con la ayuda del paquete sanctum de Laravel 8.

Asimismo, te explicaremos paso a paso cómo probar la REST API de autenticación de Laravel 8 Sanctum usando la herramienta de prueba Postman.

Laravel Sanctum ofrece un sistema de autenticación impecable, seguro, increíblemente rápido y liviano para aplicaciones de una sola página (SPA), aplicaciones móviles y API simples basadas en token.

Sanctum es un paquete profundo que permite a cada usuario generar múltiples tokens API para su cuenta de forma independiente. Estos tokens otorgan varios roles y ámbitos que designan qué acciones pueden realizar los tokens.

Entonces, comencemos a crear la API de descanso de sanctum en la aplicación laravel sin entrar en teorías.
Ejemplo de la API REST de Laravel 8 Sanctum Auth

Estas son las instrucciones para construir una API relajante, segura y sin complicaciones en la aplicación laravel 8.


 
1: Descarga del paquete de laravel 

composer create-project --prefer-dist laravel/laravel laravel-sanctum-auth


2: Configura el archivo ENV.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=db_nombre
DB_USERNAME=root
DB_PASSWORD=


3: Instalar el paquete Laravel Sanctum

Escriba el comando composer en la consola del terminal y ejecútelo para comenzar a instalar el paquete sanctum en la aplicación laravel. 

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"



4: Ahora tenemos que des-comentar una lineas "la azul" para que registre el middleware sanctum en la matriz api dentro del archivo app/Http/Kernel.php déjalo así:

protected $middlewareGroups = [
...
...
    'api' => [
        \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
        'throttle:api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
...
...
];


5: Hagamos la primera migración para crear la base de datos

php artisan migrate

Posteriormente, tenemos que preparar la configuración de sanctum para el proyecto de autenticación de laravel. Solo hay que agregarle la clase sanctum HasApiTokens en el app/Models/User.php

Te dejo todo el código por las dudas podes remplazarlo totalmente o solo las lineas que falten
pero presta atención ya que la instalación del paquete en la mayoría de los casos lo hace solo y no tienes que hacer nada, esto es por si acaso.

<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
// sanctum
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];
    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];
    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}


6: Creamos ahora el modelo, la migración y el controlador con sus métodos 

php artisan make:model Blog -m



7: Configuramos la migración de blogs agregando dos campitos de prueba 

$table->id();
$table->string('title');
$table->text('description');
$table->timestamps();

y creamos la migración 

php artisan migrate

8: Entramos al modelo Blog y le agregamos el código que esta en negro para que permita escribir en esos campos

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Blog extends Model
{
    use HasFactory;
    protected $fillable = [
        'title', 
        'description'
    ];    
}



9: Creamos el controlador en una capeta llamada API y con sus métodos "-r"

php artisan make:controller API/BlogController -r

 
Agregamos sus métodos lo tienes que dejar así:

<?php
   
namespace App\Http\Controllers\API;
   
use Illuminate\Http\Request;
use App\Http\Controllers\API\BaseController as BaseController;
use Validator;
use App\Models\Blog;
use App\Http\Resources\Blog as BlogResource;
   
class BlogController extends BaseController
{
    public function index()
    {
        $blogs = Blog::all();
        return $this->sendResponse(BlogResource::collection($blogs), 'Posts encontrados.');
    }
    
    public function store(Request $request)
    {
        $input = $request->all();
        $validator = Validator::make($input, [
            'title' => 'required',
            'description' => 'required'
        ]);
        if($validator->fails()){
            return $this->sendError($validator->errors());       
        }
        $blog = Blog::create($input);
        return $this->sendResponse(new BlogResource($blog), 'Post Creado.');
    }
   
    public function show($id)
    {
        $blog = Blog::find($id);
        if (is_null($blog)) {
            return $this->sendError('Post does not exist.');
        }
        return $this->sendResponse(new BlogResource($blog), 'Post encontrado.');
    }
    
    public function update(Request $request, Blog $blog)
    {
        $input = $request->all();
        $validator = Validator::make($input, [
            'title' => 'required',
            'description' => 'required'
        ]);
        if($validator->fails()){
            return $this->sendError($validator->errors());       
        }
        $blog->title = $input['title'];
        $blog->description = $input['description'];
        $blog->save();
        
        return $this->sendResponse(new BlogResource($blog), 'Post updated.');
    }
   
    public function destroy(Blog $blog)
    {
        $blog->delete();
        return $this->sendResponse([], 'Registro Borrado.');
    }
}


NO TE PREOCUPES SI TE DA ERRORES EN EL MARCADO VISUAL CODE,
ES PORQUE AUN NO HEMOS AGREGADO UNA CLASE QUE VA A CONTINUACIÓN
SIGUE ADELANTE!!!


10: Crear los recursos API
Esto nos permite mejorar la salida de los registros por ejemplo veras claramente el formato fecha a continuación

php artisan make:resource Blog

Coloca el código sugerido en el archivo  app/Http/Resources/Blog.php 

<?php
  
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class Blog extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'title' => $this->title,
            'description' => $this->description,
            'created_at' => $this->created_at->format('m/d/Y'),
            'updated_at' => $this->updated_at->format('m/d/Y'),
        ];
    }
    
}

11: Creamos el controlador BaseController

php artisan make:controller API/BaseController -r

y le agregamos el codigo

<?php

namespace App\Http\Controllers\API;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller as Controller;

class BaseController extends Controller
{
    /**
     * success response method.
     *
     * @return \Illuminate\Http\Response
     */
    public function sendResponse($result, $message)
    {
    $response = [
            'success' => true,
            'data'    => $result,
            'message' => $message,
        ];
        return response()->json($response, 200);
    }

    /**
     * return error response.
     *
     * @return \Illuminate\Http\Response
     */
    public function sendError($error, $errorMessages = [], $code = 404)
    {
    $response = [
            'success' => false,
            'message' => $error,
        ];
        if(!empty($errorMessages)){
            $response['data'] = $errorMessages;
        }
        return response()->json($response, $code);
    }
}


12: Creamos el AuthController y le agregamos el código o mejor remplaza todo su contenido

php artisan make:controller API/AuthController -r

<?php
   
namespace App\Http\Controllers\API;
   
use Illuminate\Http\Request;
use App\Http\Controllers\API\BaseController as BaseController;
use Illuminate\Support\Facades\Auth;
use Validator;
use App\Models\User;
   
class AuthController extends BaseController
{
    public function signin(Request $request)
    {
        if(Auth::attempt(['email' => $request->email, 'password' => $request->password])){ 
            $authUser = Auth::user(); 
            $success['token'] =  $authUser->createToken('MyAuthApp')->plainTextToken; 
            $success['name'] =  $authUser->name;
   
            return $this->sendResponse($success, 'User signed in');
        } 
        else{ 
            return $this->sendError('Unauthorised.', ['error'=>'Unauthorised']);
        } 
    }
    public function signup(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'name' => 'required',
            'email' => 'required|email',
            'password' => 'required',
            'confirm_password' => 'required|same:password',
        ]);
   
        if($validator->fails()){
            return $this->sendError('Error validation', $validator->errors());       
        }
   
        $input = $request->all();
        $input['password'] = bcrypt($input['password']);
        $user = User::create($input);
        $success['token'] =  $user->createToken('MyAuthApp')->plainTextToken;
        $success['name'] =  $user->name;
   
        return $this->sendResponse($success, 'User created successfully.');
    }
   
}

13: Creando las rutas remplaza todo el código también para ahorrar tiempo en route/api.php

<?php
  
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
  
use App\Http\Controllers\API\AuthController;
use App\Http\Controllers\API\BlogController;

  
Route::post('login', [AuthController::class, 'signin']);
Route::post('register', [AuthController::class, 'signup']);
     
Route::middleware('auth:sanctum')->group( function () {
    Route::resource('blogs', BlogController::class);
});

14: Prueba de la Api usando postman



{
    "name": "Enrique",
    "email": "compucenter33@gmail.com",
    "password": "12345678",
    "confirm_password": "12345678"

}



Prueba de login observa marco el token y botón derecho copiar luego lo pegaremos


Pegar el token



Ingresar un articulo al blog con permiso

Buscar un blog por el id
Ver todos

Editando



Felicidades lo has conseguido!!!


por si acaso aquí tienes el código completo https://github.com/compucenter33/laravel8-api-laravel-sanctum-auth


Comentarios

Entradas populares de este blog

Reseteo de canon ip 1800 y 1900

Veremos en este vídeo las dos formas de resetear estas impresoras la segunda forma es definitiva. También aprendemos como resetear los cartuchos para que muestre el nivel de tinta después de las recargas. Descarga del programa utilizado en el video : bajar  

CloudFlare en vez de DuckDns

Vamos a dejar de usar Duckdns para usar un dominio propio que compramos Ademas ya sabemos que nuestra ip cambia y vamos a solucionarlo con una app usando docker compose Comenzamos con los pasos: 1- Comprar un dominio  2 - Registrarnos en CloudFlare justo ahi es de donde sacaremos las dns ej dn1.claudflare.com, dn2.claudflare.com 3- Copiaremos esas dns y las pegaremos en nuestro dominio para eso entramos a hostinger y editamos las dns que vienen por defecto y las cambiamos por estas,  esto da el control de todo a cloudflare a partir de ese momento trabajaremos solo en cloudflare. 4 - Vamos a nuestro menú Perfil en cloudFlare y creamos un token como muestra la imagen    5- En claudflare le damos clic al logo y nos vamos a la pagina de inicio y agregamos el nombre de nuestro dominio comprado ej compucenter33.com 6- Entramos haciendo clic en el dominio y nos vamos al menú a la izquierda que dice DNS ahí creamos un registro A  nos queda así  El primer registro A...

Carrito de compras en laravel

Bienvenido a la creación de un Shopping Cart rápido y simple!!! Crearemos entonces un carrito usando laravel de una manera muy rápida y fácil aquí encontraras todos los pasos correspondientes a el video: Deberías ya tener el entorno de trabajo pronto, para eso instalas xampp, visual studio code y git con eso listo, comencemos: Paso 1 - Creamos un proyecto nuevo: composer create-project --prefer-dist laravel/laravel blog "6.*" Paso 2 - Instalamos en componente shopping cart "nuestro carrito" composer require "darryldecode/cart" Paso 3 - Abrimos el archivo de nuestro proyecto config/app.php y en el array de nombre Aliases al final pega esto: 'Cart' => Darryldecode\Cart\Facades\CartFacade::class Paso 4 - Crea el Modelo Product y su archivo de migración php artisan make:model Product -m Paso 5 - Agrega los campos para nuestra migración products Schema::create('products', function (Blueprint $table) { ...