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

results matching ""

    No results matching ""