Crea una API Rest con Autenticaci贸n 馃攼 Laravel y Passport
Tiempo de lectura: 3.62 minutos
Lo que encontrar谩s en este art铆culo
- Paso 1. Crear un proyecto Laravel nuevo
- Paso 2. Instalar el paquete Laravel Passport
- Paso 3. Ejecutar las migraciones
- Paso 4. Generar llaves
- Paso 5. Configuraci贸n de Passport
- Paso 6. Definir las rutas principales para la API
- Paso 7: Crear un Controlador para resolver las rutas
- Paso 8: Verificar el funcionamiento de la API
- Referencias
Hoy vamos a desarrollar una API Rest usando Laravel y Passport.
La configuraci贸n es m谩s sencilla de lo que parece.
S贸lo ten en cuenta que para seguir esta gu铆a necesitas de Laravel 5.8 o superior.
Paso 1. Crear un proyecto Laravel nuevo
Puedes crear el proyecto Laravel usando Composer:
composer create-project --prefer-dist laravel/laravel auth
O si eres de los que prefiere Laravel Installer, puedes hacer lo mismo con laravel new auth.
Como ves:
- En este caso,
authes el nombre del proyecto. - Pero si ya tienes uno creado, puedes seguir los pasos all铆.
Si vas a trabajar con un proyecto nuevo, recuerda que tambi茅n debes configurar las credenciales de acceso a tu base de datos.
Por ejemplo, puedes crear una base de datos llamada "auth", y entonces definir en tu archivo .env:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=auth
DB_USERNAME=root
DB_PASSWORD=
Paso 2. Instalar el paquete Laravel Passport
Laravel Passport nos permite configurar un servidor de OAuth2 sobre nuestro Laravel en muy poco tiempo.
composer require laravel/passport
Paso 3. Ejecutar las migraciones
El paquete Passport, al descargarse, incluye migraciones.
Es importante ejecutar estas migraciones, para contar con las tablas necesarias para guardar informaci贸n de los clients y access tokens:
php artisan migrate
Si no entiendes muy bien de qu茅 estoy hablando es porque no est谩s familiarizado con el protocolo OAuth2.
En ese caso:
- Te recomiendo empezar por este art铆culo sobre OAuth2.
- Y si deseas profundizar, puedes seguir este curso de OAuth 2 ?.
Paso 4. Generar llaves
Para que nuestro proyecto pueda generar access tokens seguros es necesario contar con encryption keys (llaves que se usan en el proceso de encriptaci贸n).
Para ello debemos ejecutar:
php artisan passport:install
Este comando adem谩s va a crear clients, que luego podemos usar para generar access tokens:
Paso 5. Configuraci贸n de Passport
Ahora debes agregar el trait Laravel\Passport\HasApiTokens a tu modelo App\User.
Este trait habilita m茅todos para el modelo, que te permitir谩n inspeccionar el token del usuario autenticado y sus scopes correspondientes.
<?php namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable
{
use Notifiable, HasApiTokens;
// ...
}
Para que Passport funcione correctamente tambi茅n debes habilitar sus rutas.
Para esto basta con llamar el m茅todo Passport::routes dentro del AuthServiceProvider de tu proyecto.
Espec铆ficamente dentro del m茅todo boot.
Estas rutas permiten a Passport hacer issue y revoke de access tokens y clients.
<?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
{
// ...
public function boot()
{
$this->registerPolicies();
Passport::routes(); // <---
}
}
Con esto listo ya puedes ir a tu archivo de configuraci贸n config/auth.php y asignar el driver "passport" para el authentication guard llamado "api":
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport', // <---
'provider' => 'users',
],
],
De esta manera, Passport se encargar谩 de validar las peticiones entrantes a la API.
Hasta aqu铆 ya tenemos Laravel Passport configurado correctamente.
Sin embargo, la pregunta es:
驴c贸mo podemos usar Passport y definir las primeras rutas de nuestra API?
Veamos ello a continuaci贸n.
Paso 6. Definir las rutas principales para la API
S贸lo debes dirigirte al archivo routes/api.php, y agregar all铆:
Route::group([
'prefix' => 'auth'
], function () {
Route::post('login', 'AuthController@login');
Route::post('signup', 'AuthController@signUp');
Route::group([
'middleware' => 'auth:api'
], function() {
Route::get('logout', 'AuthController@logout');
Route::get('user', 'AuthController@user');
});
});
驴Qu茅 hace este c贸digo?
- Define 4 rutas, asignando a todas un prefijo "auth".
- Las 2 primeras rutas son p煤blicas, y las 2 siguientes requieren de autenticaci贸n.
Paso 7: Crear un Controlador para resolver las rutas
En el paso anterior hemos declarado 4 rutas, cada una asociada con un m茅todo del controlador AuthController.
Entonces s贸lo hace falta crear dicho controlador:
class AuthController extends Controller
{
/**
* Registro de usuario
*/
public function signUp(Request $request)
{
$request->validate([
'name' => 'required|string',
'email' => 'required|string|email|unique:users',
'password' => 'required|string'
]);
User::create([
'name' => $request->name,
'email' => $request->email,
'password' => bcrypt($request->password)
]);
return response()->json([
'message' => 'Successfully created user!'
], 201);
}
/**
* Inicio de sesi贸n y creaci贸n de token
*/
public function login(Request $request)
{
$request->validate([
'email' => 'required|string|email',
'password' => 'required|string',
'remember_me' => 'boolean'
]);
$credentials = request(['email', 'password']);
if (!Auth::attempt($credentials))
return response()->json([
'message' => 'Unauthorized'
], 401);
$user = $request->user();
$tokenResult = $user->createToken('Personal Access Token');
$token = $tokenResult->token;
if ($request->remember_me)
$token->expires_at = Carbon::now()->addWeeks(1);
$token->save();
return response()->json([
'access_token' => $tokenResult->accessToken,
'token_type' => 'Bearer',
'expires_at' => Carbon::parse($token->expires_at)->toDateTimeString()
]);
}
/**
* Cierre de sesi贸n (anular el token)
*/
public function logout(Request $request)
{
$request->user()->token()->revoke();
return response()->json([
'message' => 'Successfully logged out'
]);
}
/**
* Obtener el objeto User como json
*/
public function user(Request $request)
{
return response()->json($request->user());
}
}
Paso 8: Verificar el funcionamiento de la API
Aqu铆 puedes iniciar un servidor con PHP usando php artisan serve.
Sin embargo, si dispones de un servidor web como Apache, lo mejor es que definas VirtualHosts para tus proyectos.
Para probar nuestra API debemos hacer peticiones a las rutas que hemos definido.
Una forma muy conveniente de hacerlo es a trav茅s de Postman.
隆Entonces empecemos!
Headers
Dado que estamos consultando una API Rest que devuelve datos en formato JSON, es importante agregar los siguientes 2 headers en cada una de nuestras peticiones:
Content-Type: application/json
X-Requested-With: XMLHttpRequest
Registro
Hacemos una petici贸n POST y registramos un usuario con nuestros datos.
Login
Usando nuestros datos de usuario podemos iniciar sesi贸n, y obtener un access_token, que nos permitir谩 identificarnos ante la API.
Datos de usuario
Podemos consultar rutas protegidas enviando un Authorization header y el token que obtuvimos anteriormente.
Cerrar sesi贸n
Si hacemos una petici贸n GET a la ruta de logout con nuestro token, 茅ste ser谩 invalidado.
No autenticado
De modo que si intentamos obtener nuestros datos de usuario con el mismo token, la API protegida por el middleware nos responder谩 que no estamos autenticados.