Middlewares
Middlewares são funções que podem ser adicionadas ao router para interceptar, transformar ou abortar requisições que trafegam pelo sistema de roteamento.
É possível adicionar vários middlewares no router e todos eles são chamados na ordem em que foram adicionados, caso algum middleware retorne false a requisição é abortada, e os demais middlewares não são executados.
Um bom exemplo de Middleware é um autenticador, que tem como objetivo analisar se a URL requisitada requer autenticação para ser acessada, vamos implementar um desses para exemplificar.
Neste exemplo iremos fazer um simples teste de URLs não autenticadas via config.json e validação de um token nos cookies.
Primeiro, vamos configurar as rotas no config.json
{
...
"authentication": {
"notAuthURLS": [
"/app/auth/login"
]
}
...
}
Pronto, agora a URL _'/app/auth/login' _poderá ser acessada sem autenticação, já que é ela que irá autenticar o usuário.
Agora, em nosso startup.js importamos o router e servidor, e criamos um middleware:
let router = require('router')
let server = require('http')
//Assim criamos um middleware no sistema de roteamento
router.addMiddleware(function(params, request, response) {
return true //Caso seja retornado false, a requisição é interrompida.
})
server.createServer(8778, router)
Agora vamos implementar a nossa lógica de autenticação no middleware que criamos.
let router = require('router')
let server = require('http')
router.addMiddleware(function(params, request, response) {
//Primeiro devemos verificar se a URL deste request é autenticada ou não
if (!isAuthenticatedUrl(request)) {
return true
}
// Se é autenticada
// Tentamos carregar a informação de autenticação de um cookie, por exemplo
let token = extractToken(request, 'auth-token')
if (!token || !isTokenValid(token)) { //Se não temos um token ou ele é invalido
//Adicionamos um 401 como resposta
response.json({
message: 'Authentication Error: Not Authenticated',
status: 401
}, 401)
return false //Retornamos false para interromper a requisição.
}
return true
})
function isAuthenticatedUrl(request) {
var uri = request.requestURI
// Se não está em nossa lista então é autenticado
return getConfig().authentication.notAuthURLS.indexOf(uri) == -1
}
function isTokenValid(token) {
//Uma lógica para validação do token
}
function extractToken (request, name) {
var cookies = request.cookies
for (var i = 0; i < cookies.length; i++) {
if (cookies[i].getName() === name) {
return cookies[i].getValue()
}
}
}
server.createServer(8778, router)
Pronto, agora temos um middleware que analisa todas as URLs que estão sendo requisitadas e realiza a verificação de autenticação.
O thrust já possui uma biblioteca de autenticação que funciona de forma semelhante ao exemplo dado acima, é bem simples de instalar e configurar nas aplicações, como qualquer outra biblioteca do thrust, caso queira dar uma olhada, este é o repositório: thrust-bitcodes/authentication