Node.js: Gerir segredos
Como gerir segredos com Node.js
👋 Bem-vindo à documentação do Stackhero!
A Stackhero oferece uma solução Node.js cloud pronta a usar que proporciona uma série de benefícios, incluindo:
- Implemente a sua aplicação em segundos com um simples
git push.- Utilize o seu próprio nome de domínio e beneficie da configuração automática de certificados HTTPS para uma segurança reforçada.
- Desfrute de tranquilidade com backups automáticos, atualizações com um clique, e preços simples, transparentes e previsíveis.
- Obtenha desempenho ótimo e segurança robusta graças a uma VM privada e dedicada.
Poupe tempo e simplifique a sua vida: só leva 5 minutos para experimentar a solução de hospedagem cloud Node.js da Stackhero!
Quando o seu projeto Node.js interage com uma base de dados, armazenamento de objetos ou uma API externa, armazenar de forma segura credenciais como nomes de utilizador, palavras-passe ou tokens, frequentemente referidos como "segredos", é crucial. Manter estes segredos confidenciais é essencial para garantir a segurança.
O que pode ser tentado fazer
Pode inicialmente considerar algo assim:
// Conectar a uma base de dados PostgreSQL
const pg = new Client({
host: 'xxxxx.stackhero-network.com',
user: 'admin',
password: 'myPassword',
database: 'admin'
});
Infelizmente, este método não é seguro. Porquê? Porque os seus segredos podem acabar no seu repositório Git, expondo-os a qualquer pessoa com acesso. Mesmo que pense que só você tem acesso, é como deixar um Post-it com as suas palavras-passe no monitor e assumir que ninguém mais o verá. Isto pode eventualmente levar a problemas de segurança.
Além disso, esta abordagem não suporta uma gestão fluida de diferentes ambientes, como desenvolvimento e produção.
As variáveis de ambiente
Uma prática amplamente adotada na indústria é armazenar segredos em variáveis de ambiente.
As variáveis de ambiente são definidas fora do seu código e configuradas antes do início do Node.js. O conceito é definir todos os seus segredos usando variáveis de ambiente, evitando codificá-los diretamente na sua aplicação.
Definir as suas primeiras variáveis de ambiente
Para definir uma variável de ambiente, pode configurá-la no início da sua invocação Node.js assim: MY_PASSWORD=myDevelopmentPassword node app.js
Este comando define uma variável chamada "MY_PASSWORD" com o valor "myDevelopmentPassword". O formato é simplesmente <KEY>=<value>.
Por convenção, as variáveis de ambiente são escritas em letras maiúsculas. Note que apenas strings podem ser utilizadas, não arrays ou objetos.
Ler variáveis de ambiente
No seu ficheiro app.js, pode ler a sua nova variável de ambiente com process.env assim: console.log(process.env.MY_PASSWORD);. Isto irá exibir myDevelopmentPassword.
Agora, a palavra-passe é definida fora do código, impedindo que seja publicada no repositório Git.
No Stackhero, num ambiente de produção, tem a opção de definir uma nova variável de ambiente chamada "MY_PASSWORD" contendo "myProductionPassword" diretamente no painel de controlo do seu serviço Node.js, garantindo um funcionamento suave.
Exemplo de configuração Node.js no painel de controlo Stackhero
Em conclusão, a sua palavra-passe já não está armazenada no seu código, e tem palavras-passe separadas para os ambientes de desenvolvimento e produção.
Usar a biblioteca dotenv
Em cenários reais, frequentemente é necessário gerir múltiplos segredos. Por exemplo, conectar a uma base de dados requer armazenar um hostname, um utilizador e uma palavra-passe.
Gerir um único segredo é simples, mas gerir vários pode tornar-se complicado. Imagine iniciar a sua aplicação com esta linha de comando:
POSTGRESQL_HOST=xxxxx.stackhero-network.com POSTGRESQL_USER=admin POSTGRESQL_PASSWORD=myPassword node app.js
Esta linha é pouco prática e difícil de manter. Uma aplicação em produção pode requerer múltiplas variáveis, tornando esta abordagem impraticável.
É aqui que a biblioteca dotenv se torna inestimável.
Com dotenv, os segredos podem ser armazenados num ficheiro separado chamado .env.
Primeiro, pode instalar a biblioteca dotenv com:
npm install dotenv
Depois, crie um ficheiro .env contendo as variáveis:
POSTGRESQL_HOST=xxxxx.stackhero-network.com
POSTGRESQL_USER=admin
POSTGRESQL_PASSWORD=myPassword
Certifique-se de que este ficheiro .env não é enviado para o repositório Git adicionando-o à lista de ficheiros ignorados:
echo ".env" >> .gitignore
Finalmente, carregue a biblioteca dotenv no topo do seu ficheiro app.js assim:
require("dotenv").config();
Com esta configuração, ao iniciar a sua aplicação com node app.js, dotenv irá automaticamente ler o conteúdo do ficheiro .env na sua plataforma de desenvolvimento. Em produção, este ficheiro não existe, e as variáveis de ambiente são obtidas diretamente da configuração do seu serviço Node.js (disponível no painel de controlo Stackhero).
Exemplo funcional
Tudo isto foi teoria. Vamos mergulhar num exemplo real de funcionamento.
Pode encontrar um exemplo completo disponível aqui: https://github.com/stackhero-io/dotenvWithNodejs
Agora sabe como gerir os seus segredos de uma forma flexível e segura, tudo de forma muito fácil.