November 8, 2018

Laravel & Nexmo – Autenticazione a Due fattori

Versioni utilizzate nella lezione

laravel@5
php@5.6

Introduzione

In questo Tutorial creeremo l’applicazione e prepareremo il sistema per effettuare la Login. Poi estenderemo la login classica di Laravel aggiungendo il parametro relativo al numero di telefono. Creiamo un sistema di autenticazione a due fattori con Laravel e Nexmo. Sfrutteremo quest’ultimo per l’invio di un SMS con il codice di autenticazione dell’utente….

Parte 1/4

Inizializzazione

  • Crafting dell’applicazione Laravel,lancia il comando con il nome della tua application

install
    laravel new application
  

  • Configurazione del Database

Creazione dell’autenticazione

install
    php artisan make:auth
  

  • Migrazione del database

install
    php artisan migrate
  

Aggiungere il numero di telefono

  • Lanciamo il comando per creare il file

install
    php artisan make:migration add_users_phone_number
  

  • Aggiungiamo il codice

add_users_phone_number
    <?php

      use Illuminate\Support\Facades\Schema;
      use Illuminate\Database\Schema\Blueprint;
      use Illuminate\Database\Migrations\Migration;

      class AddUsersPhoneNumber extends Migration
      {
          /**
          * Run the migrations.
          *
          * @return void
          */
          public function up()
          {
              //
              Schema::table('users', function (Blueprint $table) {
                  $table->string('phone_number')->after('password');
              });
          }

          /**
          * Reverse the migrations.
          *
          * @return void
          */
          public function down()
          {
              //
              Schema::table('users', function (Blueprint $table) {
                  $table->dropColumn('phone_number');
              });
          }
      }
  

Parte 2/4

Creazione delle nuove Routes

web.php
        ...
        Route::get('/verify', 'SmsController@show')->name('verify');
        Route::get('/resend_sms', 'SmsController@resend_sms')->name('resend_sms');
        Route::post('/verify', 'SmsController@verify')->name('verify');
        ...
  

Creazione della View per il Verify del SMS

file_type_html views/auth/sms/verify.blade.php
        @extends('layouts.app')

        @section('content')
          <div class="container">
              <div class="row">
                  <div class="col-md-8 col-md-offset-2">
                      <div class="panel panel-default">
                          <div class="panel-heading">Verify</div>

                          <div class="panel-body">
                              <form class="form-horizontal" role="form" method="POST" action="{{ route('verify') }}">
                                  {{ csrf_field() }}

                                  <div class="form-group{{ $errors->has('code') ? ' has-error' : '' }}">
                                      <label for="code" class="col-md-4 control-label">Code</label>

                                      <div class="col-md-6">
                                          <input id="code" type="number" class="form-control" name="code" value="{{ old('code') }}" required autofocus>

                                          @if ($errors->has('code'))
                                          <span class="help-block">
                                                  <strong>{{ $errors->first('code') }}</strong>
                                              </span>
                                          @endif
                                      </div>
                                  </div>
                                  <div class="form-group">
                                      <div class="col-md-6 col-md-offset-4">
                                          <button type="submit" class="btn btn-primary">
                                              Verify Account
                                          </button>
                                      </div>
                                  </div>
                              </form>
                          </div>
                      </div>
                  </div>
              </div>
          </div>
          @endsection
  

Installiamo Nexmo

  • Installiamo Nexmo

install
    composer require nexmo/laravel
    php artisan vendor:publish
  

  • configura le chiavi di nexmo in .env con

.env
    NEXMO_KEY=tua key
    NEXMO_SECRET=tua secret
  

Parte 3/4

Configurazione di Nexmo e LoginController

LoginController.php
        ...
        public function authenticated(Request $request, Authenticatable $user){
          Auth::logout();
          $request->session()->put('verify:user:id', $user->id);
          $request->session()->put('verify:phone_number', $user->phone_number);

          try {
              $verification = Nexmo::verify()->start([
                  'number' => $user->phone_number,
                  'brand'  => 'Isjeady Sms'
              ]);
              $user->request_id = $verification->getRequestId();
              $user->save();
          } catch (Exception $e) {
              return redirect()->back()->withErrors([
                  'code' => $e->getMessage()
              ]);
          }

          /*
          logger("verification");
          logger($verification);
          */
          return redirect('verify');
        }
        ...
  

Sms Controller

SmsController.php
        <?php

          namespace App\Http\Controllers;

          use App\User;
          use Illuminate\Http\Request;
          use Illuminate\Support\Facades\Auth;
          use Nexmo\Client\Exception\Exception;
          use Nexmo\Laravel\Facade\Nexmo;

          class SmsController extends Controller{

              public function show(Request $request) {
                  return view('auth.sms.verify');
              }

              public function resend_sms(Request $request) {
                  $phone_number = $request->session()->get('verify:phone_number');
                  return redirect()->back()->with('resend_sms', 'Resend success:' . $phone_number);
              }

              public function verify(Request $request) {
                  logger("VERIFY");
                  $this->validate($request, [
                      'code' => 'size:4',
                  ]);

                  $user_id = $request->session()->get('verify:user:id');
                  $user = User::where('id',$user_id)->get()->first();

                  try {
                      $response = Nexmo::verify()->check(
                          $user->request_id,
                          $request->code
                      );
                      //logger("response");
                      //logger($response);
                      Auth::loginUsingId($request->session()->pull('verify:user:id'));
                      return redirect('/home');
                  } catch (Exception $e) {
                      return redirect()->back()->withErrors([
                          'code' => $e->getMessage()
                      ]);
                  }
              }
          }
  

Parte 4/4

Resend del SMS

SmsController.php
        ...
        public function resend_sms(Request $request) {
        if($request->session()->has('verify:user:id') && !Auth::user()){

            $user_id = $request->session()->get('verify:user:id');
            $user = User::where('id',$user_id)->get()->first();

            try {
                $verification = Nexmo::verify()->start([
                    'number' =>  $user->phone_number,
                    'brand'  => 'Isjeady Sms'
                ]);
                $user->request_id = $verification->getRequestId();
                $user->save();
                return redirect()->back()->with('resend_sms', 'Resend success !!!');
            } catch (Exception $e) {
                return redirect()->back()->withErrors([
                    'code' => $e->getMessage()
                ]);
            }

        }else{
            return  redirect()->route('login');
        }
    }
        ...
  

Installazione del Codice Sorgente

Per installarlo:

  • Scaricalo quì

  • Unzip il file .Zip in una dir

  • Da linea di comando spostati nella dir

  • Lancia il comando ‘composer install’ e poi ‘npm install’

    install
      composer install
      npm install
      

  • Duplica il file .env.example in .env puoi anche lanciare il comando

    copy
        mv .env.example .env
      

  • Configura il nome del Db (crealo sul tuo DBMS,Mysql Workbench per esempio),user,e password.

  • lancia il comando

Command
  php artisan migrate

  • configura le chiavi di nexmo in .env con

.env
  NEXMO_KEY=tua key
  NEXMO_SECRET=tua secret

  • lancia il comando ‘php artisan serve’

Command
  php artisan serve

  • l’app è pronta per essere utilizzata
Fine Lezione

CONTENT SECTION

Ricevi la Guida Pdf e
Il Mini Corso Gratuito

Le migliori tecnologie per diventare uno sviluppatore Web al passo con i tempi. Trovi tutto nella sezione unità del gruppo Facebook.

ENTRA ORA NELLA NOSTRA COMMUNITY

Commenti

Se non visualizzi i commenti correttamente Ricarica la pagina