Exercício – Gerir o ciclo de vida de um pedido
Tailwind Traders precisa de sua aplicação para ter alguma segurança básica. O aplicativo Express deve diferenciar entre clientes registrados que têm acesso e outros usuários que não devem ter acesso. Outras funcionalidades, como a gestão de funções, podem ser adicionadas numa fase posterior.
Adicionar autorização básica a uma arquitetura Express
A maioria das aplicações tem partes que podem ser acedidas por qualquer pessoa. No entanto, algumas partes precisam de ser protegidas. Há diferentes maneiras de proteger uma aplicação. Neste exercício, você implementará um sistema de proteção simples para entender como o mecanismo de middleware funciona na estrutura Express.
Criar um servidor Web
Neste exercício, continue a usar o contêiner de desenvolvimento. Um projeto de exemplo que tem arquivos de produto e código de aplicativo inicial é fornecido para você. Você preencherá as partes faltantes do projeto para concluir as atualizações do aplicativo para o cliente.
Abra a pasta node-essentials/nodejs-http/exercise-express-middleware em um terminal clicando com o botão direito do mouse no nome da pasta e selecionando Abrir no terminal integrado.
Esta pasta tem três ficheiros: app.js, client.js e package.json.
O arquivo package.json contém uma dependência chamada
express
. Execute o seguinte comando para instalar a dependência:npm install
npm
lê adependencies
seção no arquivo de package.json e instala os pacotes necessários.Em um editor de códigos, abra o arquivo app.js e inspecione o conteúdo:
const express = require("express"); const app = express(); const port = 3000; app.get("/", (req, res) => res.send("Hello World!")); app.get("/users", (req, res) => { res.json([ { id: 1, name: "User Userson", }, ]); }); app.get("/products", (req, res) => { res.json([ { id: 1, name: "The Bluest Eye", }, ]); }); app.listen(port, () => console.log(`Example app listening on port ${port}!`));
O código contém um aplicativo Express funcional com três rotas: barra
/
,/users
e/products
.
Criar um aplicativo cliente
Em um editor de código, abra o arquivo de aplicativo client.js e inspecione o conteúdo:
const http = require('http');
const options = {
port: 3000,
hostname: 'localhost',
path: '/users',
headers: {}
};
const req = http.get(options, (res) => {
console.log(`Connected - Status Code ${res.statusCode}`);
res.on('data', (chunk) => {
console.log("Chunk data: ", chunk.toString());
});
res.on('end', () => {
console.log('No more data');
});
res.on('close', () => {
console.log('Connection closed');
});
});
req.on('error', (error) => {
console.error('An error occurred: ', error);
});
req.end();
Este código é um cliente HTTP simples que se conecta ao aplicativo Express. Não é um navegador da web. Ele não processa HTML. Ele apenas se conecta ao servidor e lê os dados que são retornados. É um bom exemplo de uso do módulo HTTP do Node.js.
O código do aplicativo cliente se conecta ao endereço http://localhost:3000/users
da /users
rota. O cliente ouve três eventos: data
, end
, e close
. Ao emitir um evento, todas as funções anexadas a esse evento específico são chamadas de forma síncrona. Isso garante o sequenciamento adequado dos eventos e ajuda a evitar condições de corrida e erros de lógica. Quando apropriado, as funções de ouvinte podem alternar para um modo assíncrono de operação usando os setImmediate()
métodos or process.nextTick()
. Isso não é abordado neste módulo.
Execute o programa Express
Agora você está pronto para experimentar o programa Express com um aplicativo cliente.
No terminal, inicie o programa de servidor Express digitando este comando:
node app.js
Nota
Verifique se você está executando o arquivo app.js localizado em
/nodejs-http/exercise-express-middleware
.Abra um segundo terminal e inicie o aplicativo cliente:
node client.js
No segundo terminal, você deve ver a seguinte saída do cliente:
connected - statusCode: 200 chunk [{"id":1,"name":"User Userson"}] No more data Closing connection
O servidor Express responde com alguns dados do usuário,
chunk [{"id":1,"name":"User Userson"}]
. Todas as partes do aplicativo funcionam.O aplicativo cliente termina depois que ele exibe a saída.
No primeiro terminal (o servidor Express), pressione Ctrl + C para parar o programa.
Proteja a rota
Para proteger essa rota, adicionaremos algum código ao aplicativo Express.
Em um editor de código, abra o arquivo /nodejs-http/exercise-express-middleware/app.js . Localize a
const app = express()
instrução. Após esta instrução, adicione o seguinte código:function isAuthorized(req, res, next) { const authHeader = req.headers.authorization; if (!authHeader || authHeader !== 'secretpassword') { return res.status(401).send('Unauthorized: Access Denied'); } next(); }
Em seguida, localize a seguinte seção de código no mesmo arquivo:
app.get("/users", (req, res) => { res.json([ { id: 1, name: "User Userson", }, ]); });
Substitua esta seção pelo código a seguir para que o middleware seja o
isAuthorized
segundo argumento:app.get("/users", isAuthorized, (req, res) => { res.json([ { id: 1, name: "User Userson", }, ]); });
Execute o programa Express e invoque o middleware
Tente o aplicativo cliente novamente com o programa de servidor atualizado.
No primeiro terminal, execute o seguinte comando para reiniciar o programa Express:
node app.js
No segundo terminal, reinicie o aplicativo cliente:
node client.js
No segundo terminal, você verá a seguinte saída:
connected - statusCode: 401 chunk Not permitted No more data Closing connection
Desta vez, o middleware é invocado
isAuthorized()
e procura um cabeçalho que tenha umauthorization
valor específico. Como você não forneceu um valor específico como parte de sua solicitação, o código não respondeu com dados específicos do usuário. Em vez disso, a resposta foichunk Not permitted
. Você adicionará autorização específica na próxima seção.No primeiro terminal, pressione Ctrl + C para parar o programa.
Adicionar cabeçalho de autorização
Você precisa adicionar um cabeçalho para um authorization
valor específico.
Em um editor de código, abra o arquivo nodejs-http/exercise-express-middleware/client.js novamente. Localize a seguinte instrução:
headers: {},
Substitua esta instrução pelo seguinte código:
headers: { authorization: 'secretpassword' },
Execute o programa Express com autorização do cliente
Tente o cliente novamente com um authorization
cabeçalho.
No primeiro terminal, execute o seguinte comando para reiniciar o programa Express:
node app.js
No segundo terminal, execute o seguinte comando para executar o cliente novamente:
node client.js
No segundo terminal, você deve ver a seguinte saída:
connected - statusCode: 200 chunk [{"id":1,"name":"User Userson"}] No more data Closing connection
Os dados do usuário são retornados porque você passou um cabeçalho com um
authorization
valor aceito.No primeiro terminal, pressione Ctrl + C para parar o programa.
Parabéns! Você aprendeu como usar middleware no Express para adicionar pré-processamento, autorização básica, ao seu programa Express.
Atenção
Esteja ciente de que uma autenticação/autorização destinada ao uso no mundo real precisa ser mais robusta do que este exemplo. Vale a pena procurar conceitos como OAuth, JSON Web Tokens, JWT e a biblioteca bcrypt para garantir que seu aplicativo tenha proteção contra usuários não autorizados.
Recipiente de desenvolvimento de limpeza
Depois de concluir o projeto, você pode querer limpar seu ambiente de desenvolvimento ou devolvê-lo ao seu estado típico.
Excluir o ambiente do GitHub Codespaces garante que você possa maximizar a quantidade de direitos de horas gratuitas por núcleo que você obtém para sua conta.
Importante
Para obter mais informações sobre os direitos da sua conta do GitHub, consulte Codespaces do GitHub mensalmente incluídos armazenamento e horas principais.
Entre no painel do GitHub Codespaces (https://github.com/codespaces).
Localize seus Codespaces atualmente em execução provenientes do
MicrosoftDocs/node-essentials
repositório GitHub.Abra o menu de contexto do espaço de código e selecione Excluir.