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
Publicar un comentario