🚀 Nuova versione beta disponibile! Feedback o problemi? Contattaci

Installazione e Configurazione di un Server GraphQL con Apollo e JWT

Codegrind Team•Sep 03 2024

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 query me 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

  1. Registrazione di un Utente:
mutation {
  register(username: "testuser", password: "mypassword") {
    id
    username
    token
  }
}
  1. Login dell’Utente:
mutation {
  login(username: "testuser", password: "mypassword") {
    id
    username
    token
  }
}
  1. 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.