Gestire l'autenticazione in Lumen

Mattepuffo's logo
Gestire l'autenticazione in Lumen

Gestire l'autenticazione in Lumen

Lumen è un micro framework per PHP adatto alla creazione di servizi REST.

Lo sto usando e devo dire che mi sto trovando davvero bene.

Oggi vediamo come abilitare e gestire l'autenticazione; in pratica saremo costretti ad inviare un token tramite header quando richiediamo la risorsa.

Do per scontato l'installazione del framework, e non tratteremo come validare il token; quello dipende anche da come avete la registrazione utente, ecc.

Vi indico gli step che ho fatto io, e che mi hanno funzionato.

1) Impostare la connessione al database nel file .env

APP_ENV=local
APP_DEBUG=true
APP_KEY=
APP_TIMEZONE=UTC

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=DB_NOME
DB_USERNAME=USERNAME
DB_PASSWORD=PASSWORD

CACHE_DRIVER=file
QUEUE_DRIVER=sync

2) Modificare il file bootstrap/app.php

Qui dentro dovete decommentare queste righe:

$app->withFacades();
$app->routeMiddleware([
    'auth' => AppHttpMiddlewareAuthenticate::class,
]);
$app->register(AppProvidersAuthServiceProvider::class);

In pratica abbiamo:

  • abilitato Facades, che useremo per interagire con il db.
  • registrato il Middelware dell'autenticazione (il nome assegnato lo useremo nel controller)
  • registrato il Provider dell'autenticazione

3) Modificare il file app/Providers/AuthServiceProvider

Vi posto l'intera classe:

namespace App\Providers;

use App\User;
use Illuminate\Support\ServiceProvider;

class AuthServiceProvider extends ServiceProvider {

    public function register() {
    }

    public function boot() {
        $this->app['auth']->viaRequest('api', function ($request) {
            $header = $request->header('Api-Token');
            if ($header) {
                return new User();
            }
            return null;
        });
    }

}

4) Creare il controller che estrae i dati in: app/Http/Controllers/ClientiController

Il controller è basato sulla mia tabella, ma in sostanza ha determinate funzioni che estraggono i dati; queste funzioni le richiameremo nelle routes:

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;

class ClientiController extends Controller {

    public function __construct() {
        $this->middleware('auth');
    }

    public function getByClienteCodice($clienteCodice) {
        return DB::select('CALL sp_get_clienti_codice(?)', [$clienteCodice]);
    }

}

Guardate come nel costruttore abbiamo impostato il middleware dell'autenticazione; come vedremo, questo fa si che se non inviamo un token, la query non viene eseguita.

5) Creare le routes che ci servono in routes/web.php

In questo file vengono gestite tutte le routes, è c'è anche quella di default.

Questo il mio codice:

$router->get('/', function () use ($router) {
    return $router->app->version();
});

$router->group(['prefix' => 'clienti'], function () use ($router) {

    $router->get('cliente/{codice}', ['uses' => 'ClientiController@getByClienteCodice']);
});

Io ho creato un gruppo, per raggruppare tutte le varie routes associate ad un controller.

Poi ho detto alla route di usare il controller ClientiController; e dopo la @ ho indicato quale metodo usare.

Il parametro viene passato in automatico dalla route.

Bene, detto questo vi posto tre esempi con cURL per inviare le richieste.

$ curl -i -H "Content-type: application/json" "https://www.sito.it/ws/public/clienti/cliente/5569"

Questo ci dirà che non siamo autorizzati, in quanto non abbiamo token.

$ curl -i -H "Content-type: application/json" -H "Api-Token: CIAO" "https://www.sito.it/ws/public/clienti/cliente/5569"

Questo funzionerà perchè nell'header abbiamo mandato un token, e abbiamo rispettato il path; poi quali e quanti recordi dipendo dal valore passato.

$ curl -i -H "Content-type: application/json" -H "Api-Token: CIAO" "https://www.sito.it/ws/public/clienti/cliente/"

Questo ci darà errore perchè non abbiamo passato il parametro da ricercare.

Quindi abbiamo raggiunto lo scopo.

Quello che dovete aggiungere è il controllo sul token; noi ne passiamo uno a caso, invece andrebbe controllato che sia valido e corretto (ad esempio confrontandolo con il database).

Enjoy!


Condividi

Commentami!