Node.js: Gestire i segreti

Come gestire i segreti con Node.js

👋 Benvenuti nella documentazione di Stackhero!

Stackhero offre una soluzione Node.js cloud pronta all'uso che fornisce numerosi vantaggi, tra cui:

  • Distribuisci la tua applicazione in pochi secondi con un semplice git push.
  • Usa il tuo nome di dominio e beneficia della configurazione automatica dei certificati HTTPS per una sicurezza potenziata.
  • Goditi la tranquillità con backup automatici, aggiornamenti con un clic, e una tariffazione semplice, trasparente e prevedibile.
  • Ottieni prestazioni ottimali e una sicurezza robusta grazie a una VM privata e dedicata.

Risparmia tempo e semplificati la vita: bastano solo 5 minuti per provare la soluzione di hosting cloud Node.js di Stackhero!

Quando il tuo progetto Node.js interagisce con un database, uno storage di oggetti o un'API esterna, è fondamentale memorizzare in modo sicuro le credenziali come nomi utente, password o token, spesso chiamati "segreti". Mantenere questi segreti riservati è essenziale per garantire la sicurezza.

Potresti inizialmente considerare qualcosa del genere:

// Connessione a un database PostgreSQL
const pg = new Client({
  host: 'xxxxx.stackhero-network.com',
  user: 'admin',
  password: 'myPassword',
  database: 'admin'
});

Purtroppo, questo metodo non è sicuro. Perché? Perché i tuoi segreti potrebbero finire nel tuo repository Git, esponendoli a chiunque abbia accesso. Anche se pensi di essere l'unico ad avere accesso, è come lasciare un Post-it con le tue password sul monitor e supporre che nessun altro le vedrà. Questo può eventualmente portare a problemi di sicurezza.

Inoltre, questo approccio non supporta una gestione fluida dei diversi ambienti, come sviluppo e produzione.

Una pratica ampiamente adottata nel settore è memorizzare i segreti nelle variabili d'ambiente.

Le variabili d'ambiente sono definite al di fuori del tuo codice e impostate prima che Node.js inizi. Il concetto è di definire tutti i tuoi segreti usando variabili d'ambiente, evitando di codificarli direttamente nella tua applicazione.

Per definire una variabile d'ambiente, puoi impostarla all'avvio della tua applicazione Node.js in questo modo: MY_PASSWORD=myDevelopmentPassword node app.js

Questo comando imposta una variabile chiamata "MY_PASSWORD" con il valore "myDevelopmentPassword". Il formato è semplicemente <KEY>=<value>.

Per convenzione, le variabili d'ambiente sono scritte in lettere maiuscole. Nota che possono essere utilizzate solo stringhe, non array o oggetti.

Nel tuo file app.js, puoi leggere la tua nuova variabile d'ambiente con process.env in questo modo: console.log(process.env.MY_PASSWORD);. Questo visualizzerà myDevelopmentPassword.

Ora, la password è definita al di fuori del codice, impedendo che venga pubblicata nel repository Git.

Su Stackhero, in un ambiente di produzione, hai la possibilità di definire una nuova variabile d'ambiente chiamata "MY_PASSWORD" contenente "myProductionPassword" direttamente nel dashboard del tuo servizio Node.js, garantendo un funzionamento fluido.

Esempio di configurazione Node.js sul dashboard StackheroEsempio di configurazione Node.js sul dashboard Stackhero

In conclusione, la tua password non è più memorizzata nel tuo codice e hai password separate per gli ambienti di sviluppo e produzione.

In scenari reali, spesso è necessario gestire più segreti. Ad esempio, connettersi a un database richiede di memorizzare un hostname, un utente e una password.

Gestire un solo segreto è semplice, ma gestirne diversi può diventare complicato. Immagina di avviare la tua applicazione con questa riga di comando:

POSTGRESQL_HOST=xxxxx.stackhero-network.com POSTGRESQL_USER=admin POSTGRESQL_PASSWORD=myPassword node app.js

Questa riga è poco pratica e difficile da mantenere. Un'applicazione in produzione potrebbe richiedere molte variabili, rendendo questo approccio impraticabile.

È qui che la libreria dotenv diventa preziosa.

Con dotenv, i segreti possono essere memorizzati in un file separato chiamato .env.

Per prima cosa, puoi installare la libreria dotenv con:

npm install dotenv

Quindi, crea un file .env contenente le variabili:

POSTGRESQL_HOST=xxxxx.stackhero-network.com
POSTGRESQL_USER=admin
POSTGRESQL_PASSWORD=myPassword

Assicurati che questo file .env non venga inviato al repository Git aggiungendolo alla lista dei file ignorati:

echo ".env" >> .gitignore

Infine, carica la libreria dotenv all'inizio del tuo file app.js in questo modo:

require("dotenv").config();

Con questa configurazione, quando avvii la tua applicazione con node app.js, dotenv leggerà automaticamente il contenuto del file .env sulla tua piattaforma di sviluppo. In produzione, questo file non esiste e le variabili d'ambiente sono direttamente derivate dalla configurazione del tuo servizio Node.js (disponibile sul dashboard Stackhero).

Tutto questo era teoria. Passiamo a un esempio pratico.

Puoi trovare un esempio completo disponibile qui: https://github.com/stackhero-io/dotenvWithNodejs

Ora sai come gestire i tuoi segreti in modo flessibile e sicuro, tutto molto facilmente.