Koa.js - Autenticazione
L'autenticazione è un processo in cui le credenziali fornite vengono confrontate con quelle archiviate nel database delle informazioni degli utenti autorizzati su un sistema operativo locale o all'interno di un server di autenticazione. Se le credenziali corrispondono, il processo è completato e all'utente viene concessa l'autorizzazione per l'accesso.
Creeremo un sistema di autenticazione molto semplice che utilizzeremo Basic HTTP Authentication. Questo è il modo più semplice possibile per imporre il controllo degli accessi poiché non richiede cookie, sessioni o altro. Per usarlo, il client deve inviare l'intestazione di autorizzazione insieme a ogni richiesta che fa. Il nome utente e la password non sono crittografati, ma sono concatenati in una singola stringa come la seguente.
username:password
Questa stringa è codificata con Base64 e la parola Basic viene inserita prima di questo valore. Ad esempio, se il tuo nome utente è Ayush e la password India, la stringa"Ayush:India" verrebbe inviato come codificato nell'intestazione dell'autorizzazione.
Authorization: Basic QXl1c2g6SW5kaWE=
Per implementarlo nella tua app koa, avrai bisogno del middleware koa-basic-auth. Installalo usando -
$ npm install --save koa-basic-auth
Ora apri il tuo file app.js e inserisci il seguente codice al suo interno.
//This is what the authentication would be checked against
var credentials = { name: 'Ayush', pass: 'India' }
var koa = require('koa');
var auth = require('koa-basic-auth');
var _ = require('koa-router')();
var app = koa();
//Error handling middleware
app.use(function *(next){
try {
yield next;
} catch (err) {
if (401 == err.status) {
this.status = 401;
this.set('WWW-Authenticate', 'Basic');
this.body = 'You have no access here';
} else {
throw err;
}
}
});
// Set up authentication here as first middleware.
// This returns an error if user is not authenticated.
_.get('/protected', auth(credentials), function *(){
this.body = 'You have access to the protected area.';
yield next;
});
// No authentication middleware present here.
_.get('/unprotected', function*(next){
this.body = "Anyone can access this area";
yield next;
});
app.use(_.routes());
app.listen(3000);
Abbiamo creato un middleware per la gestione degli errori per gestire tutti gli errori relativi all'autenticazione. Quindi, abbiamo creato 2 percorsi:
/protected- È possibile accedere a questa route solo se l'utente invia l'intestazione di autenticazione corretta. Per tutti gli altri, darà un errore.
/unprotected - Questo percorso è accessibile da chiunque, con o senza l'autenticazione.
Ora se invii una richiesta a / protected senza un'intestazione di autenticazione o con le credenziali sbagliate, riceverai un errore. Per esempio,
$ curl https://localhost:3000/protected
Riceverai la risposta come:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic
Content-Type: text/plain; charset=utf-8
Content-Length: 28
Date: Sat, 17 Sep 2016 19:05:56 GMT
Connection: keep-alive
Please authenticate yourself
Tuttavia, con le giuste credenziali, otterrai la risposta attesa. Per esempio,
$ curl -H "Authorization: basic QXl1c2g6SW5kaWE=" https://localhost:3000/protected -i
Riceverai la risposta come:
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 38
Date: Sat, 17 Sep 2016 19:07:33 GMT
Connection: keep-alive
You have access to the protected area.
Il percorso / non protetto è ancora accessibile a tutti.