Koa.js - autenticação
A autenticação é um processo no qual as credenciais fornecidas são comparadas àquelas armazenadas no banco de dados de informações de usuários autorizados em um sistema operacional local ou em um servidor de autenticação. Se as credenciais corresponderem, o processo será concluído e o usuário receberá autorização de acesso.
Estaremos criando um sistema de autenticação muito básico que usará Basic HTTP Authentication. Esta é a maneira mais simples possível de aplicar o controle de acesso, pois não requer cookies, sessões ou qualquer outra coisa. Para usar isso, o cliente deve enviar o cabeçalho de autorização junto com cada solicitação feita. O nome de usuário e a senha não são criptografados, mas são concatenados em uma única string como a seguir.
username:password
Essa string é codificada com Base64 e a palavra Basic é colocada antes desse valor. Por exemplo, se seu nome de usuário for Ayush e senha Índia, a string"Ayush:India" seria enviado codificado no cabeçalho de autorização.
Authorization: Basic QXl1c2g6SW5kaWE=
Para implementar isso em seu aplicativo koa, você precisará do middleware koa-basic-auth. Instale-o usando -
$ npm install --save koa-basic-auth
Agora abra seu arquivo app.js e insira o seguinte código nele.
//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);
Criamos um middleware de tratamento de erros para tratar todos os erros relacionados à autenticação. Então, criamos 2 rotas -
/protected- Esta rota só pode ser acessada se o usuário enviar o cabeçalho de autenticação correto. Para todos os outros, apresentará um erro.
/unprotected - Esta rota pode ser acessada por qualquer pessoa, com ou sem a autenticação.
Agora, se você enviar uma solicitação para / protected sem um cabeçalho de autenticação ou com as credenciais erradas, você receberá um erro. Por exemplo,
$ curl https://localhost:3000/protected
Você receberá a resposta como -
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
No entanto, com as credenciais certas, você obterá a resposta esperada. Por exemplo,
$ curl -H "Authorization: basic QXl1c2g6SW5kaWE=" https://localhost:3000/protected -i
Você receberá a resposta como -
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.
A rota / desprotegida ainda é acessível a todos.