Autenticación REST API con Laravel 5.5 Passport

Stiven Castillo
4 min readSep 29, 2017

--

En este post (Nivel principiante) voy a poner en práctica y a explicar un poco el uso de Laravel Passport, ya que para algunos es un poco confuso la manera en como se explica en la documentación oficial de Laravel.

Vamos a definir varios conceptos importantes antes de empezar:

OAuth2 es un protocolo de autorización que permite a terceros, clientes o sistemas, acceder a contenidos propiedad de un usuario, alojados en un servidor de recursos sin que éstos tengan que manejar ni conocer las credenciales del usuario, es decir, usuario y contraseña. www.exentrit.mx/que-es-oauth2/

Laravel Passport es un paquete oficial de Laravel para integrar fácilmente un servidor OAuth 2 a tu aplicación de Laravel.

Instalación de Laravel Passport

Definidos estos conceptos vamos a empezar, lo primero que debemos hacer es crear nuestra aplicación Laravel vía composer:

composer create-project --prefer-dist laravel/laravel laravel-api
cd laravel-api

Dentro de la carpeta del proyecto ejecutamos el siguiente comando para configurar Passport

composer require laravel/passport

Luego abrimos el archivo config/app.php y pegamos esta linea en el array de providers

Laravel\Passport\PassportServiceProvider::class,

Lo siguiente es ejecutar las migraciones

php artisan migrate

Nota: Configurar la base de datos en su archivo .env antes de realizar este paso.

Ahora ejecutamos el siguiente comando

php artisan passport:install

Este comando creará las claves de cifrado necesarias para generar tokens de acceso seguro

Configuración de Laravel Passport en el proyecto

En el modelo app/User.php incluimos el trait HasApiTokens de Laravel Passport

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens,Notifiable;

Ahora editamos el archivo app/Providers/AuthServiceProvider.php

use Laravel\Passport\Passport;
// Colocamos las rutas de Passport en el metodo boot()
public function boot()
{
$this->registerPolicies();
Passport::routes();
}

Por último cambiamos el driver de authenticación en config/auth.php

'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],

'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],

Crear Endpoints de Registro y Login

Vamos a crear en controlador que procesará la información del login y registro de un usuario, para ello usamos artisan:

php artisan make:controller Api/AuthController

Abrimos el archivo que se creó app/Http/Controller/Api/AuthController.php e incluimos estas lineas en la parte superior

use App\User;
use Illuminate\Support\Facades\Auth;
use Validator;

Endpoint Registro

En este paso tenemos que crear una nueva función en nuestro controlador AuthController le vamos a dar un nombre register. En esta función tenemos que hacer lo siguiente:

Validar los datos que envía en usuario (Este paso lo podemos hacer por medio de Request Validation. Pero por ahora vamos a validar en el controlador)

Si el usuario envía datos erróneos, mostrar los errores

Encriptar el password (Aquí podemos usar Eloquent Mutators para encriptar este campo directamente en el modelo)

public function register(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required',
'email' => 'required|email',
'password' => 'required',
'confirm_password' => 'required|same:password',
]);

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

$input = $request->all();
$input['password'] = bcrypt($request->get('password'));
$user = User::create($input);
$token = $user->createToken('MyApp')->accessToken;

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

En app/routes/api.php declaramos la ruta de registro

Route::post('register', 'Api\AuthController@register');

Probamos en Postman

Endpoint Login

El login es simple, solo autenticamos al usuario y generamos el token.

public function login(Request $request)
{
if (Auth::attempt($request->only('email', 'password'))) {
$user = Auth::user();
$token = $user->createToken('MyApp')->accessToken;
return response()->json([
'token' => $token,
'user' => $user
], 200);
} else {
return response()->json(['error' => 'Unauthorised'], 401);
}
}

En app/routes/api.php declaramos la ruta de registro

Route::post('login', 'Api\AuthController@login');

Ahora probamos en Postman

Perfecto, es hora de consumir nuestro Api

Consumir Endpoint

Vamos a hacer algo muy sencillo a manera de ejemplo, vamos a obtener los datos del usuario (perfil) que se está autenticando.

public function profile()
{
$user = Auth::user();
return response()->json(compact('user'), 200);
}

En el archivo app/routes/api.php creamos un Route Group y definimos el middleware auth:api este va a restringir a usuarios no authenticados.

Route::group(['middleware' => 'auth:api'], function () {
Route::post('profile', 'Api\AuthController@profile');
});

Luego de esto abrimos Postman e ingresamos la url de la ruta /api/profile, abrimos la pestaña Headers y configuramos los siguientes valores:

Accept:application/json
Authorization:Bearer (TOKEN)

En el valor de Authorization concatenar Bearer (el token que devuelve el login).

Qué significa Bearer? aquí un link a una discusión dónde ver esta información. Why is Bearer required.

Recibimos correctamente la información del usuario autenticado, con esto finalizamos y ya estamos listo para construir un ApiRest más compleja, pronto subiré un tutorial de como consumir este ApiRest desde Angular 4.

Laravel — Subir multiples archivos al servidor

--

--

Stiven Castillo
Stiven Castillo

Written by Stiven Castillo

Javascript Developer and UI Designer

No responses yet