Webtask + mLab + Auth0

Stefan Horochovec
horochovec
Published in
5 min readMay 4, 2016

Olá pessoal,

Neste post, irei abordar a junção de serviços disponíveis na nuvem chamados Webtask.io e mLab, criando um serviço REST para gravação e obtenção de uma lista de registros e ainda contando com autenticação utilizando a plataforma Auth0.

Bom, vou iniciar o post com algumas contextualizações:

O que é o Webtask.io?
A proposta do Webtask é permitir que você execute um código com execução remota em um servidor, sem a necessidade de preparar um ambiente para deploy do mesmo. A plataforma do Webtask é executada em NodeJS, portanto, é necessário um conhecimento prévio sobre essa tecnologia.

Para utilizarmos a plataforma Webtask, é necessária a criação de uma conta através deste link (Necessário uma conta no serviço Auth0). Após seu registro, você estará apto a utilizar o serviço de forma gratuita com algumas limitações.

A grande vantagem na utilização deste serviço é que podemos manter nossas chamadas autenticadas baseadas nas aplicações criadas dentro da plataforma Auth0, garantindo que apenas usuários autenticados possam fazer sua utilização.

Após seu registro na plataforma Webtask, é necessária a instalação do CLI da plataforma, para que você possa efetuar o deploy do seu código, para a instalação, execute o seguinte comando em seu terminal:

$ npm install wt-cli -g

Após a instalação, você deverá iniciar a configuração do CLI utilizando o comando:

$ wt init [SEU-EMAIL-DA-SUA-CONTA-Auth0]

Ok, nesse momento, já possuímos uma conta válida na plataforma Auth0, já habilitamos nossa conta na plataforma Webtask e configuramos nossa linha de comando para que possamos enviar nossas tasks para o servidor na nuvem.

O que é o mLab?
mLab é um serviço que tem como objetivo prover o serviço de Database-as-a-Service (DaaS) for MongoDB. O conceito de Database as a Service (DaaS) surgiu com o intuito de prover uma instância de banco de dados na nuvem configurada para nossa utilização, ou seja, não é necessário nenhum conhecimento avançado sobre gerência de SGDB’s para consumir o serviço. Ao criar um conta, o serviço estará automaticamente configurado, sendo necessário apenas a definição do nome do banco de dados, seus usuários e privilégios (na maioria dos DaaS)

O próximo passo então, é criarmos uma conta no serviço mLab, que irá permitir que tenhamos uma instância de um MongoDB gratuita na nuvem para efetuarmos o registro de informações via serviço feito deploy no Webtask.

Após seu registro no mLab, iremos efetuar a criação de uma instância do MongoDB, conforme imagens abaixo:

Após a criação do banco, é necessária a configuração de usuários e senhas para a conexão com o MongoDB, para essa configuração, basta seguir o fluxo conforme as imagens abaixo:

E como resultado:

Ok, feito isso, estamos prontos para iniciar o desenvolvimento do nosso código para efetuar o deploy dentro do Webtask.io.

Bom, o primeiro conceito que devemos lembrar, é que não possuímos acesso físico ao servidor. O nosso código será enviado via CLI, desta forma, não temos acesso para instalar modulos do NodeJS, assim sendo, o correto é antes de tudo, verificar quais são os módulos no NodeJS que estão disponíveis para nosso uso. Para fazer esta verificação, por favor, utilize esse link.

O segundo conceito bastante importante é que não é obrigatório o uso de autenticação para utilização dos serviços na Webtask.io, ou seja, você pode efetuar o deploy de uma tarefa no serviço e ela não precisa implementar nenhuma rotina de segurança em nenhum aplicativo vinculado ao seu perfil na Auth0. Entretanto, nesse artigo iremos efetuar uma abordagem no sentido de autenticar os requests feitos.

Caso você não tenha feito a configuração de um aplicativo na Auth0, sugiro a leitura deste artigo.

Ok, a primeira task que iremos publicar, é uma task que tem como objetivo receber um POST com um JSON, contendo uma atividade a ser armazenada em nosso servidor MongoDB, simulando o desenvolvimento de uma aplicação “To Do”.

Para isso, iremos criar um arquivo chamado new-task.js, com o seguinte conteúdo:

Módulos necessários para a implementação

var app = new (require('express'))();
var wt = require('webtask-tools');
var MongoClient = require('mongodb').MongoClient;

Função para obtermos uma conexão com o MongoDB

function getCollection(url) {
return new Promise( (resolve, reject) => {
MongoClient.connect(url, (error, db) => {
if(error) {
return reject(error);
}
resolve(db.collection('tasks'));
});
});
}

Função para salvamos uma “task” em uma collection do MongoDB

function saveTask(doc, collection) {
return new Promise( (resolve, reject) => {
collection.insertOne(doc, (error, result) => {
if (error) {
return reject(error);
}
resolve(result);
});
});
}

Interceptação do POST em nossa task, efetuando o registro da mesma na collection anterior

app.post('*', function (req, res) {
const task = {
task: req.webtaskContext.data.task
}
getCollection(req.webtaskContext.data.MONGO_URL)
.then(collection => saveTask(task, collection))
.then(post => res.status(200).json(post))
.catch(err => res.status(500).end('Error: ' + err.message));
});

Exposição do serviço do express, solicitando sua autenticação via método .auth0()

module.exports = wt.fromExpress(app).auth0();

Algumas considerações podem ser feitas até aqui. Percebam que não informamos qualquer tipo de restrição com relação a validação do Token do usuário em cada request, e também não informamos dentro do nosso arquivo new-task.js a String de conexão com o banco.

Essas informações são repassadas a plataforma da Webtask, via linha de comando, no momento de deploy da aplicação.

O deploy deve ser feito via command line, conforme exemplo abaixo:

wt create -s AUTH0_CLIENT_ID="" -s AUTH0_CLIENT_SECRET="" -s AUTH0_DOMAIN="" -s MONGO_URL="" new-task.js
Webtask created
You can access your webtask at the following url: https://webtask.it.auth0.com/api/run/[YOUR-ID]/new-task?webtask_no_cache=1

Percebam que estou informando quatro parâmetros com a opção -s (secret). Três deles referentes as minhas credenciais de autenticação da minha aplicação na plataforma Auth0, e uma delas corresponde a minha URL de conexão com o MongoDB, obtida na plataforma mLab.

Para que você possa testar corretamente o aplicativo, basta você informar os parametros corretamente, e na sequencia, executar a consulta informando como parâmetro da URL o seu Token obtido na autenticação de seu usuário na Auth0. Para isso, a URL acima ficaria da seguinte forma: https://webtask.it.auth0.com/api/run/[YOUR-ID]/new-task?access_token=[YOUR-TOKEN].

Nesse exemplo no github, eu adicionei dois serviços, um para a gravação de um registro (new-task.js), e um segundo serviço, para a leitura das tasks registradas no MongoDB (list-task.js).

Qualquer dúvida, basta enviar um comentário aqui!

Um abraço!

--

--