Loading...

Rest API + OAUTH2 Server con Laravel y Passport

Durante el periodo de permanecer en casa, no solamente estaré tomando cursos, también compartiré algunos tutoriales que pueden ser de utilidad para quienes tengan la intención de aprender cosas nuevas.

Hoy generaremos un servidor OAUTH2 en Laravel (php) y la librería Passport.

Antes de iniciar, platiquemos que es OAUTH y para que funciona.

OAUTH2

OAuth 2 es una framework de autorización que le permite a las aplicaciones obtener acceso limitado a cuentas de usuario en un servicio HTTP, como Facebook, Google, GitHub, etc. Delega la autenticación del usuario al servicio que aloja la cuenta del mismo y autoriza a las aplicaciones de terceros el acceso a dicha cuenta de usuario. OAuth 2 proporciona flujos de autorización para aplicaciones web y de escritorio; y dispositivos móviles.

Te ha aparecido alguna vez una pantalla similar a la siguiente?

No alt text provided for this image

Si es así, has autorizado a alguna aplicación que pueda tomar información de tu cuenta de Facebook, es muy importante verificar que las cuentas aplicaciones que autorizamos, únicamente obtengan acceso a la información que estamos dispuestos a brindarles.

¿Cómo funciona?

Una imagen dice más que mil palabras, así que el siguiente flujo describe como funciona OAUTH

No alt text provided for this image

Básicamente: Le estamos dando permisos a una aplicación a acceder a información para asegurar la identidad del usuario.

Suena muy complicado ¿no?

Pues no lo es, puedes generar servidores de OAUTH con diferentes tecnologías.

En java puedes usar Spring Boot, en PHP Laravel + Passport.

Incluso puedes usar SaaS como OKTA.

Hoy haremos el servidor en PHP + Laravel + Passport

Instalación de Laravel

(No entraré en los detalles de como instalar Laravel, para ello puedes ver la guía oficial de instalación aquí)

En una terminal, ejecuta el siguiente comando para instalar Laravel

composer create-project –prefer-dist laravel/laravel APIRest

Una vez que se complete la instalación, crea una base de datos y actualiza el archivo .env con las credenciales de la base de datos

Agregar dependencias de Laravel Passport

¿Qué es Laravel Passport?

Laravel Passport es un servidor OAuth2 y un paquete de autenticación que es simple y sencillo de usar.

Dentro de la carpeta del proyecto, ejecuta el siguiente comando para instalar Laravel Passport

composer require laravel/passport

Esquema de Usuarios

Abre el archivo database/migrations/create_users_table y modifica con la información relevante al usuario, para el ejemplo usaremos información básica de usuario

public function up()

{

  Schema::create(‘users’, function (Blueprint $table) {

    $table->bigIncrements(‘id’);

    $table->string(‘firstname’);

    $table->string(‘lastname’);

    $table->string(‘phone’);

    $table->string(‘email’)->unique();

    $table->timestamp(‘email_verified_at’)->nullable();

    $table->string(‘password’);

    $table->rememberToken();

    $table->timestamps();

  });

}

Para alterar la estructura de la base de datos, tenemos que ejecutar las “migraciones”, este procedimiento crea las tablas necesarias para el proyecto.

(Para este ejercicio usaremos Postgresql, si estás usando MySQL ejecuta los siguientes pasos)

==========================

SOLO MySQL

Abrir el archivo AppServiceProvider.php que se encuentra en la carpeta app/Providers y agrega al método boot a lo siguiente

Schema::defaultStringLength(191);

==========================

Ahora para ejecutar las migraciones ejecuta:

php artisan migrate

En estos momentos tenemos la estructura básica(tabla de usuarios) para leer/escribir a nuestros usuarios.

Para agregar el módulo de autenticación, es necesario instalar passport 

php artisan passport:install

A nuestro modelo User (App\User) hay que agregarle la funcionalidad HasApiToken

<?php 

namespace App;

use Illuminate\Foundation\Auth\User as Authenticatable;

use Illuminate\Notifications\Notifiable;

use Laravel\Passport\HasApiTokens;

class User extends Authenticatable

{

  use HasApiTokens, Notifiable;

}

Ahora, recuerdan el migration que modificamos?(create_users_table)? tenemos que agregar a nuestro modelo las propiedades fillable que se verán afectadas por el modelo

protected $fillable = [

 ‘firstname’, ‘lastname’, ‘phone’, ‘email’, ‘password’,

];

Ahora agreguemos la funcionalidad de passport a la clase AuthServiceProvider

<?php

namespace App\Providers;

use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

use Illuminate\Support\Facades\Gate;

use Illuminate\Support\Facades\Schema;

use Laravel\Passport\Passport;

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();

  }

}

Al archivo config/auth.php debemos agregar que el driver para el API será passport

‘guards’ => [

  ‘web’ => [

    ‘driver’ => ‘session’,

    ‘provider’ => ‘users’,

  ],

‘api’ => [

    ‘driver’ => ‘passport’,

    ‘provider’ => ‘users’,

  ],

],

Ahora, agreguemos agregar las rutas API en nuestro archivo route/api.php

Route::group([‘prefix’ => ‘v1’], function () {

  Route::post(‘/login’, ‘UsersController@login’);

  Route::post(‘/register’, ‘UsersController@register’);

  Route::post(‘/users’, ‘UsersController@users’)->middleware(‘auth:api’);

  Route::get(‘/logout’, ‘UsersController@logout’)->middleware(‘auth:api’);

});

Finalmente, debemos crear el controlador para ejecutar las acciones API

Ejecuta el comando en la terminal

php artisan make:controller UsersController

Edita el archivo UsersController agregando el use 

use Illuminate\Support\Facades\Auth;

y agrega los siguientes métodos

public function login()

  {

    if (Auth::attempt([‘email’ => request(‘email’), ‘password’ => request(‘password’)])) {

      $user = Auth::user();

      $success[‘token’] = $user->createToken(‘appToken’)->accessToken;

      //After successfull authentication, notice how I return json parameters

      return response()->json([

       ‘success’ => true,

       ‘token’ => $success,

       ‘user’ => $user

     ]);

    } else {

    //if authentication is unsuccessfull, notice how I return json parameters

     return response()->json([

      ‘success’ => false,

      ‘message’ => ‘Invalid Email or Password’,

    ], 401);

    }

  }

  /**

   * Register api.

   *

   * @return \Illuminate\Http\Response

   */

  public function register(Request $request)

  {

    $validator = Validator::make($request->all(), [

      ‘firstname’ => ‘required’,

      ‘larstname’ => ‘required’,

      ‘phone’ => ‘required|unique:users|regex:/(0)[0-9]{10}/’,

      ‘email’ => ‘required|email|unique:users’,

      ‘password’ => ‘required’,

    ]);

    if ($validator->fails()) {

     return response()->json([

      ‘success’ => false,

      ‘message’ => $validator->errors(),

     ], 401);

    }

    $input = $request->all();

    $input[‘password’] = bcrypt($input[‘password’]);

    $user = User::create($input);

    $success[‘token’] = $user->createToken(‘appToken’)->accessToken;

    return response()->json([

     ‘success’ => true,

     ‘token’ => $success,

     ‘user’ => $user

   ]);

  }

  public function users()

  {

    if (Auth::user()) {

      $users = User::all();

      return response()->json([

        ‘success’ => true,

        ‘data’ => $users

      ]);

    }else {

      return response()->json([

        ‘success’ => false,

        ‘message’ => ‘Unable to Logout’

      ]);

    }

  }

  public function logout(Request $res)

  {

   if (Auth::user()) {

    $user = Auth::user()->token();

    $user->revoke();

    return response()->json([

     ‘success’ => true,

     ‘message’ => ‘Logout successfully’

   ]);

   }else {

    return response()->json([

     ‘success’ => false,

     ‘message’ => ‘Unable to Logout’

    ]);

   }

   }

Inicia el servidor con el comando

php artisan serve

Abre postman y crea 4 requests

POST localhost:8000/api/register

POST localhost:8000/api/login

GET localhost:8000/api/users

GET localhost:8000/api/logout

Puedes ver el API funcionando en las siguientes imágenes

No alt text provided for this image
No alt text provided for this image
No alt text provided for this image
No alt text provided for this image

En el siguiente artículo, platicaremos sobre el servidor de OAUTH2 y cómo sacarle el mejor uso, para eso lo integraremos con una aplicación que requiera acceder a mi cuenta de usuario del API recién creada en este tutorial.

No alt text provided for this image

Puedes descargar directamente el proyecto del siguiente repositorio de Github

https://github.com/alexcasarrubias/apirest
0

You might also like