¿Cómo crear una REST API en Laravel?

En la actualidad, una API también es conocida como un service web (servicio web). Los service web son muy importantes a la hora de crear aplicaciones web y móviles.  Como sabemos, Laravel es el framework de PHP más popular para la creación de una API. Pero si te estás iniciando y no sabes qué es una API o service web, entonces este es el lugar correcto. En este ejemplo, mostraremos cómo crear una API con autenticación de manera muy simple.

 

¿Qué es el Passport?

Las API suelen utilizar tokens para autenticar a los usuarios y no mantienen el estado de la sesión entre las peticiones. Laravel hace que la autenticación API sea muy sencilla con Laravel Passport, que proporciona una implementación completa del servidor OAuth2 para su aplicación Laravel en cuestión de minutos.

 

A continuación veremos detalladamente como implementar una API con Laravel desde cero utilizando el package Passport.

PASO 1: Instalar Laravel

composer create-project --prefer-dist laravel/laravel blog

 

PASO 2: Instalar el package Passport

De nuevo en el terminal o consola de comandos escribimos lo siguiente:

composer require laravel/passport

Después de instalar con éxito el package, abrimos el archivo config/app.php y añadimos el service provider.

config/app.php

'providers' =>[
Laravel\Passport\PassportServiceProvider::class,
],

 

PASO 3: Añadimos las tablas en la base de datos e instalamos el Passport

Después de registrar el service provider del Passport, tenemos que crear las tablas requeridas para el Passport utilizando el comando migrate; después de ejecutar el comando, veremos que se han creado varias tablas nuevas en la base de datos. A continuación vemos cómo lo hacemos.

php artisan migrate

Luego, necesitamos instalar un Passport con el comando passport:install, esto creará tokens de seguridad. Veamos cómo:

php artisan passport:install

 

PASO 4: Configuración del Passport

Para configurar el Passport debemos modificar el modelo de Usuario (User.php), el provider de autenticación (AuthServiceProvider.php) y el fichero de configuración de autenticación (auth.php).

En el modelo, añadimos la clase HasApiTokens del Passport:

app/User.php

<?php
namespace App;
use Laravel\Passport\HasApiTokens;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use HasApiTokens, 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',
];
}

 

En el AuthServiceProvider.php añadimos “Passport::routes()”:

<?php
namespace App\Providers;
use Laravel\Passport\Passport; 
use Illuminate\Support\Facades\Gate; 
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider 
{ 
/** 
* The policy mappings for the application. 
* 
* @var array 
*/ 
protected $policies = [ 
'App\Model' => 'App\Policies\ModelPolicy', 
];
/** 
* Register any authentication / authorization services. 
* 
* @return void 
*/ 
public function boot() 
{ 
$this->registerPolicies(); 
Passport::routes(); 
} 
}

En el archivo de configuración auth.php añadimos lo siguiente:

<?php
return [
'guards' => [ 
'web' => [ 
'driver' => 'session', 
'provider' => 'users', 
], 
'api' => [ 
'driver' => 'passport', 
'provider' => 'users', 
], 
],

PASO 5: Creamos la API Route

En este paso, crearemos la API Route. Laravel proporciona el archivo api.php para crear las rutas del service web. Por lo tanto, añadimos unas nuevas rutas en este archivo.

routes/api.php

<?php
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::post('login', 'API\UserController@login');
Route::post('register', 'API\UserController@register');
Route::group(['middleware' => 'auth:api'], function(){
Route::post('details', 'API\UserController@details');
});

PASO 6: Creamos el Controller

En el último paso, tenemos que crear un nuevo controlador y tres métodos API, así que primero creamos un nuevo directorio “API” en la carpeta Controllers. Dentro del directorio creamos el fichero UserController.php y añadimos el siguiente código:

<?php
namespace App\Http\Controllers\API;
use Illuminate\Http\Request; 
use App\Http\Controllers\Controller; 
use App\User; 
use Illuminate\Support\Facades\Auth; 
use Validator;
class UserController extends Controller 
{
public $successStatus = 200;
/** 
* login api 
* 
* @return \Illuminate\Http\Response 
*/ 
public function login(){ 
if(Auth::attempt(['email' => request('email'), 'password' => request('password')])){ 
$user = Auth::user(); 
$success['token'] =  $user->createToken('MyApp')-> accessToken; 
return response()->json(['success' => $success], $this-> successStatus); 
} 
else{ 
return response()->json(['error'=>'Unauthorised'], 401); 
} 
}
/** 
* Register api 
* 
* @return \Illuminate\Http\Response 
*/ 
public function register(Request $request) 
{ 
$validator = Validator::make($request->all(), [ 
'name' => 'required', 
'email' => 'required|email', 
'password' => 'required', 
'c_password' => 'required|same:password', 
]);
if ($validator->fails()) { 
return response()->json(['error'=>$validator->errors()], 401);            
}
$input = $request->all(); 
$input['password'] = bcrypt($input['password']); 
$user = User::create($input); 
$success['token'] =  $user->createToken('MyApp')-> accessToken; 
$success['name'] =  $user->name;
return response()->json(['success'=>$success], $this-> successStatus); 
}
/** 
* details api 
* 
* @return \Illuminate\Http\Response 
*/ 
public function details() 
{ 
$user = Auth::user(); 
return response()->json(['success' => $user], $this-> successStatus); 
} 
}

Ahora estamos listos para ejecutar nuestro ejemplo, con el siguiente comando lo ejecutamos rápidamente:

php artisan serve

Login API:

Ahora, podemos simplemente probarlo con las herramientas rest client, en la siguiente captura vemos un ejemplo de inicio de sesión con la API.

Validación del Register API:

La validación de los datos entrantes es el aspecto más importante al diseñar una aplicación. Por defecto, la clase del controlador base utiliza un trait llamado ValidatesRequests que proporciona un método conveniente para validar las solicitudes HTTP entrantes con una variedad de reglas de validación potentes.

Laravel Proporciona una clase validator muy fuerte cuando creas una API con laravel que luego utiliza el trait ValidatesRequests para validar tu petición. Hay que definir la clase Validator en la función de registro.

 

Register API:

Ahora, probaremos la details API. En esta API, debe establecer dos encabezados como se indica a continuación:

‘headers’ => [
‘Accept’ => ‘application/json’,
‘Authorization’ => ‘Bearer ‘.$accessToken,
]

Por lo tanto, asegúrese de que sus peticiones contienen el encabezado anterior, de lo contrario, no podrà obtener los detalles del usuario.

Details API:

 

A través del desarrollo de aplicaciones Laravel, puede desarrollar su aplicación web con un diseño más amigable, seguro, escalable y con muchas funciones que puedà cumplir sus requisitos, le ayudará a cumplir sus objetivos comerciales y llevar su negocio al siguiente nivel. Póngase en contacto con nosotros para contratar un desarrollo a medida con Laravel o comuníquese con nosotros a enviando un email a info@morethanweb.es