Archives pour la catégorie Express

Authentification WebSocket avec les sessions Express 3.x et Socket.IO

Suite à mon premier article complet sur le sujet (« Authentification et WebSocket, avec Node.JS, Express, et Socket.IO »), beaucoup m’ont signalé que les exemples ne fonctionnent plus avec Express 3.x. C’est pas tout ça mais Express est quand-même officiellement en version 3 depuis un petit moment, donc il était grand temps de mettre à jour le code !

Je vous encourage à consulter les commentaires de l’article original (merci à Laurent et Will pour leurs discussions sur ce thème) pour de plus amples informations sur les petites surprises qu’on peut rencontrer 😉

J’en profite pour vous décrire l’intégralité de la manœuvre pour que vous voyez un cas de migration Express 2→3, avec des petites astuces en passant :) Le code est dispo sur github, et chaque étape est accompagnée d’un lien vers le commit correspondant.

Lire la suite

Écrire un service REST avec NodeJS et Express – partie 2/3: jouons avec les middlewares

Dans la première partie, nous avions écrit (en mode TDD un peu raccourci) un service REST. On est quand-même allés au bout, mais ça restait améliorable.

Dans cette seconde partie nous allons jouer avec les middlewares Express pour factoriser, ajouter diverses vérifications sur les données, etc… Afin de ne pas imposer de pavés trop lourd, je garderai finalement pour un 3e article l’intégration du support de nouveaux formats, et l’écriture d’une doc agréable à utiliser.

Sommaire

Lire la suite

Écrire un service REST avec NodeJS et Express – partie 1/3: implémentation de départ

Une fois n’est pas coutume, je découperai ce tutorial en plusieurs articles distincts, histoire de voir si j’arrive à écrire des articles plus courts 😉

Nous allons voir en détail comment mettre en place un webservice RESTful avec NodeJS et le framework Express. L’objet de ce webservice sera la gestion d’une base de favoris.

Sommaire

MÀJ Oups, j’avais oublié la partie pour réellement jouer avec notre service ^^

Lire la suite

Authentification et WebSocket, avec Node.JS, Express, et Socket.IO

ATTENTION : certaines portions de code présentées ici sont valables pour Express 2.x et ne fonctionnent plus avec Express 3.x. Il s’agit principalement de la partie traitant du parsing de cookie, l’articles reste à 95% valable, mais vous trouverez les détails pour Express 3 dans cet article → Authentification WebSocket avec les sessions Express 3.x et Socket.IO

La première fois qu’on utilise les websockets, on se dit que c’est compliqué (pas tant que ça en fait). Puis on utilise socket.io, et on se dit que c’est vraiment super simple :) Et puis un jour on aimerait bien sécuriser la connexion au socket, parce que la partie « temps réel » nécessite d’être authentifié, ou simplement parce qu’il faut un pré-requis (comme avoir donné son nom avant de pouvoir chatter) avant que l’écoute ne démarre réellement.

La première idée qu’on a est de se trimballer des flags et d’activer/désactiver l’écoute de certains messages en fonction de ces flags (par exemple: tant que l’utilisateur n’a pas donné son nom, les évènements « message envoyé » sont ignorés). Le problème est que la connexion est pourtant déjà ouverte, des données y transitent déjà, et c’est donc vraiment très loin d’être idéal. De manière plus générale, il semble très complexe de communiquer avec la session utilisateur au sein du websocket. En effet on a un code de ce genre, où l’on voit bien qu’il semble impossible de manipuler la session utilisateur dans le cadre d’un websocket vu qu’il n’y a aucune notion de « request »:

sockets.on('connection', function (socket) {
  // But...
  socket.on('msg', function (data) {
    // ... where the fuck is my session?
  });
});

On va voir que le protocole est bien fait et que la connexion se fait au sein d’une enveloppe HTTP standard, et qu’on a donc accès à tous les headers d’une requête HTTP, notamment les cookies, permettant de récupérer par exemple un ID de session, et donc de lire/modifier la session utilisateur depuis le websocket!

Sommaire:

  1. Gestion des sessions avec Express
  2. Sécuriser une page
  3. Utilisation de Socket.IO
  4. Manipulation de la session utilisateur depuis un WebSocket, et sécurisation de la connexion
  5. Gestion des connexions mutiples
  6. Aller plus loin…

Note: si vous connaissez déjà bien Express et Socket.IO, vous êtes encouragé à sauter directement au chapitre 4 (éventuellement, le chapitre 2 peut rester intéressant). Le reste ne vous apprendra rien.

Retrouvez le code complet des exemples sur GitHub.

Présentation de Node.JS et du framework Express

Je me rends compte que dans ce blog je vous parle de Node.JS et d’Express, sans vous avoir jamais présenté ces technologies. Allez, revenons vite fait aux bases :)

Installation

Pour l’installation, je vous renvoie au site officiel, ou à un article en français par Atinux, mais globalement l’installation se résume à ces 3 lignes:

git clone https://github.com/ry/node.git
cd node
./configure && make && sudo make install

Présentation de Node.JS

Node.JS est un projet open-source se basant sur le moteur « V8 » de Chrome (il existe un fork « SpiderNode » par Mozilla, basé sur leur moteur SpiderMonkey).

Il s’agit donc finalement d’un simple interpréteur Javascript, exécutable, et enrichissant le langage avec sa propre API (accès au système de fichier, à la couche réseau, etc.). Ça permet, en résumé, d’exécuter des fichiers « .js » comme des scripts PHP, Python, Ruby, etc…

La spécificité n’est pas vraiment là (après tout, exécuter du JS en ligne de commande, ça se fait déjà), mais évidemment sur son API, toute entière orientée vers le non bloquant, c’est-à-dire que la plupart des commandes, notamment d’accès au système de fichier, rendront la main directement sans attendre la réponse du système, ceci étant largement simplifié par l’orientation évènementielle de Javascript. C’est ce choix de conception, ainsi que le choix du moteur V8 qui offre d’excellentes performances, qui permet d’écrire des applications avec d’excellents temps de réponse, et notamment des serveurs (web ou autres). Son API d’accès à la couche réseau (le protocole HTTP y est implémenté) couplé à cette capacité de gestion des accès concurrents en font évidemment un excellent candidat pour écrire des applications web.

Lire la suite