Proseguiamo la nostra trattazione sulla profilazione dei clienti affrontando le fasi relative all'attivazione degli utenti e al login.
Attivare il profilo utente
Per rendere attivo il profilo l'utente deve cliccare sul link inviato via e-mail. Definiamo quindi tale logica in un metodo specifico del controller principale del nostro sito.
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Customer;
use App\VerificationToken;
use Illuminate\Http\Request;
class ShopController extends Controller
{
public function confirm($id, $token)
{
$customer = Customer::find($id);
$customer_token = VerificationToken::where('value', $token)->first();
$is_valid_token = ( $customer && $customer_token );
if(!$is_valid_token) {
return redirect()->route('register')->with('error', 'Invalid parameter.');
}
$customer_token->delete();
$customer->verified = 1;
$customer->save();
return redirect()->route('register')->with('success', 'Account activated. You can now log in.');
}
}
Il token viene eliminato a conferma effettuata e il profilo del cliente viene aggiornato impostando il flag verified
a 1. Se il token non è valido l'utente viene reindirizzato alla pagina di registrazione con un messaggio di errore. Al contrario, il messaggio confermerà l'avvenuta attivazione dell'account.
@if (session('error'))
<div class="alert alert-danger mt-4 mb-4">
{{ session('error') }}
</div>
@endif
@if (session('success'))
<div class="alert alert-success mt-4 mb-4">
{{ session('success') }}
</div>
@endif
Il login
L'utente può ora effettuare il login. Definiamo un nuovo metodo nel nostro controller AJAX.
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use App\Customer;
class AjaxController extends Controller
{
public function loginCustomer(Request $request)
{
$email = $request->get('email');
$password = $request->get('password');
$customer = Customer::where('email', $email)->first();
if(!$customer || !Hash::check($password, $customer->password)) {
return response()->json(['error' => 'Invalid login.']);
}
session()->put('logged_in', '1');
session()->put('customer_id', $customer->id);
return response()->json(['success' => true]);
}
}
La verifica avviene in due fasi. Nella prima si cerca una corrispondenza nella tabella dei clienti usando l'e-mail del cliente, nella seconda si verifica che l'hash della password fornita corrisponda all'hash salvato nel database. Se la verifica ha successo vengono create due variabili di sessione che indicano che il cliente è loggato e conservano il suo ID.
Lato client definiremo il seguente codice in jQuery.
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
if( $( "#login-form" ).length ) {
$( "#login-form" ).on( "submit", function( e ) {
e.preventDefault();
var $form = $( this );
$form.find( ".alert" ).remove();
$.post( "/ajax/login", $form.serialize(), function ( res ) {
if( res.success ) {
window.location = "/profile";
} else {
$form.append( '<div class="alert alert-danger mt-4">' + res.error + '</div>' );
}
});
});
}
In caso di avvenuto login, l'utente viene reindirizzato nella sua pagina personale. Vedremo i dettagli di questa nuova sezione nei prossimi capitoli.
Un aspetto importante della profilazione è che ora il nostro menu di navigazione presenterà 3 nuove voci, ossia quella relativa alla pagina di registrazione/login, quella relativa al profilo ed il link di logout.
<li class="nav-item">
<a class="nav-link" href="{{ route('register') }}">Login / Signup</a>
</li>
@if(session('logged_in'))
<li class="nav-item">
<a class="nav-link" href="{{ route('profile') }}">Profile</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{{ route('logout') }}">Logout</a>
</li>
@endif
I link al profilo e al logout compariranno solo se il cliente è loggato. Definiamo quindi la logica di logout in un metodo specifico del nostro controller principale.
public function logout(Request $request)
{
if($request->session()->exists('logged_in') && $request->session()->exists('customer_id')) {
$request->session()->forget(['logged_in', 'customer_id']);
}
return redirect()->route('home');
}
In pratica vengono cancellate le due variabili di sessione definite in precedenza nella fase di login. Nei prossimi capitoli vedremo come proteggere il profilo utente usando un middleware di autenticazione.
Conclusione
Abbiamo visto come implementare una logica di autenticazione di base nel nostro e-commerce. Nei prossimi capitoli vedremo come estendere queste basi collegando il profilo dei clienti agli ordini effettuati sul sito.