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.