Installazione e Configurazione di un Server GraphQL con Apollo e JWT
Configurare un server GraphQL con Apollo e l’autenticazione tramite JWT è una scelta eccellente per costruire applicazioni moderne, sicure e performanti. In questa guida, ti mostrerò come installare e configurare un server Apollo da zero, integrando l’autenticazione con JWT.
Prerequisiti
Prima di iniziare, assicurati di avere:
- Node.js installato
- npm o yarn come gestore dei pacchetti
- Conoscenza di base di JavaScript/TypeScript e GraphQL
Step 1: Creazione del Progetto
Inizia creando una nuova directory per il tuo progetto e inizializzando un progetto Node.js:
mkdir my-graphql-api
cd my-graphql-api
npm init -y
Questo comando creerĂ un file package.json
nella tua directory di progetto.
Step 2: Installazione delle Dipendenze
Installa Apollo Server, GraphQL, e le librerie necessarie per l’autenticazione JWT:
npm install apollo-server graphql jsonwebtoken bcryptjs
- apollo-server: La libreria per configurare il server GraphQL.
- graphql: La libreria per lavorare con GraphQL in Node.js.
- jsonwebtoken: Per creare e verificare i token JWT.
- bcryptjs: Per criptare e verificare le password degli utenti.
Step 3: Configurazione di Base del Server Apollo
Crea un file chiamato index.js
nella radice del tuo progetto e configura Apollo Server:
const { ApolloServer, gql } = require("apollo-server");
const jwt = require("jsonwebtoken");
const bcrypt = require("bcryptjs");
// Database simulato
const users = [];
const SECRET_KEY = "your_secret_key";
// Definisci lo schema GraphQL
const typeDefs = gql`
type User {
id: ID!
username: String!
token: String
}
type Query {
me: User
}
type Mutation {
register(username: String!, password: String!): User
login(username: String!, password: String!): User
}
`;
// Definisci i resolver
const resolvers = {
Query: {
me: (_, __, context) => {
if (!context.user) throw new Error("Not authenticated");
return context.user;
},
},
Mutation: {
register: async (_, { username, password }) => {
const hashedPassword = await bcrypt.hash(password, 10);
const user = { id: users.length + 1, username, password: hashedPassword };
users.push(user);
const token = jwt.sign(
{ id: user.id, username: user.username },
SECRET_KEY
);
return { ...user, token };
},
login: async (_, { username, password }) => {
const user = users.find((user) => user.username === username);
if (!user) throw new Error("User not found");
const valid = await bcrypt.compare(password, user.password);
if (!valid) throw new Error("Incorrect password");
const token = jwt.sign(
{ id: user.id, username: user.username },
SECRET_KEY
);
return { ...user, token };
},
},
};
// Configura il contesto per gestire l'autenticazione
const server = new ApolloServer({
typeDefs,
resolvers,
context: ({ req }) => {
const token = req.headers.authorization || "";
if (token) {
try {
const user = jwt.verify(token, SECRET_KEY);
return { user };
} catch (err) {
console.error("Invalid token");
}
}
},
});
// Avvia il server
server.listen().then(({ url }) => {
console.log(`🚀 Server ready at ${url}`);
});
Spiegazione della Configurazione
- Schema GraphQL: Definiamo un tipo
User
, una queryme
per ottenere le informazioni dell’utente autenticato e due mutazioni per la registrazione e il login. - Resolvers: Implementiamo la logica per la registrazione e il login, inclusa la creazione e la verifica dei token JWT.
- Context: Ogni richiesta GraphQL riceve un contesto che include l’utente autenticato se il token JWT è valido.
Step 4: Esecuzione e Test del Server
Ora che il server è configurato, puoi avviarlo eseguendo:
node index.js
Il server sarà avviato all’indirizzo http://localhost:4000/
. Puoi accedere a questo URL nel browser per interagire con l’interfaccia GraphQL Playground.
Test delle Operazioni
- Registrazione di un Utente:
mutation {
register(username: "testuser", password: "mypassword") {
id
username
token
}
}
- Login dell’Utente:
mutation {
login(username: "testuser", password: "mypassword") {
id
username
token
}
}
- Richiesta dell’Utente Autenticato (con il token ricevuto):
query {
me {
id
username
}
}
Assicurati di includere il token JWT nell’intestazione Authorization
quando esegui la query me
.
Step 5: Best Practices
- Sicurezza del Token: Usa una chiave segreta complessa e memorizzala in modo sicuro, magari utilizzando variabili d’ambiente.
- Scadenza del Token: Configura una scadenza per i token JWT e implementa la logica per il rinnovo del token (ad esempio tramite refresh tokens).
- Hashing delle Password: Utilizza un algoritmo di hashing sicuro come bcrypt per proteggere le password degli utenti.
Conclusione
In questa guida, hai imparato come installare e configurare un server GraphQL con Apollo e gestire l’autenticazione tramite JWT. Con questa configurazione, il tuo server sarà in grado di autenticare gli utenti in modo sicuro e gestire operazioni protette tramite GraphQL. Questo setup costituisce una base solida per costruire applicazioni web moderne e sicure.