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!
php lumen facades middelware controller autenticazione
Commentami!