Autenticación REST API con Laravel 5.5 Passport
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.