Koa.js - Uwierzytelnianie

Uwierzytelnianie to proces, w którym podane poświadczenia są porównywane z danymi zapisanymi w bazie danych autoryzowanych użytkowników w lokalnym systemie operacyjnym lub na serwerze uwierzytelniania. Jeśli poświadczenia są zgodne, proces jest zakończony, a użytkownik uzyskuje uprawnienia dostępu.

Stworzymy bardzo podstawowy system uwierzytelniania, który będzie używany Basic HTTP Authentication. Jest to najprostszy możliwy sposób wymuszenia kontroli dostępu, ponieważ nie wymaga plików cookie, sesji ani niczego innego. Aby z tego skorzystać, klient musi wysłać nagłówek Authorization wraz z każdym zgłoszonym żądaniem. Nazwa użytkownika i hasło nie są szyfrowane, ale są łączone w jeden ciąg, taki jak poniżej.

username:password

Ten ciąg jest kodowany za pomocą Base64, a słowo Basic jest umieszczane przed tą wartością. Na przykład, jeśli twoja nazwa użytkownika to Ayush, a hasło India, to ciąg"Ayush:India" zostanie wysłany w postaci zakodowanej w nagłówku autoryzacji.

Authorization: Basic QXl1c2g6SW5kaWE=

Aby zaimplementować to w swojej aplikacji koa, będziesz potrzebować oprogramowania pośredniczącego koa-basic-auth. Zainstaluj go za pomocą -

$ npm install --save koa-basic-auth

Teraz otwórz plik app.js i wprowadź w nim następujący kod.

//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);

Stworzyliśmy oprogramowanie pośredniczące do obsługi błędów do obsługi wszystkich błędów związanych z uwierzytelnianiem. Następnie stworzyliśmy 2 trasy -

  • /protected- Dostęp do tej trasy jest możliwy tylko wtedy, gdy użytkownik prześle poprawny nagłówek uwierzytelniania. Dla wszystkich innych spowoduje to błąd.

  • /unprotected - Dostęp do tej trasy może uzyskać każdy, z uwierzytelnieniem lub bez.

Teraz, jeśli wyślesz żądanie do / protected bez nagłówka uwierzytelniania lub z niewłaściwymi poświadczeniami, otrzymasz błąd. Na przykład,

$ curl https://localhost:3000/protected

Otrzymasz odpowiedź jako -

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

Jednak dzięki odpowiednim poświadczeniom otrzymasz oczekiwaną odpowiedź. Na przykład,

$ curl -H "Authorization: basic QXl1c2g6SW5kaWE=" https://localhost:3000/protected -i

Otrzymasz odpowiedź jako -

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.

Trasa / niezabezpieczona jest nadal dostępna dla wszystkich.