IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

NodeJS Discussion :

Création d'un système de token


Sujet :

NodeJS

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 144
    Points : 118
    Points
    118
    Par défaut Création d'un système de token
    Bonjour,

    Je suis en train de réaliser un petit serveur avec Node.js, assez simple : il s'agit quasi uniquement de webservices (connexion, déconnexion, upload/download d'un fichier, changement de login en résumé). Etant donné que tous les webservices sont liés au compte d'un utilisateur, j'aimerais mettre en place un petit système de token.

    J'ai déjà réalisé des applications mobiles qui utilisent un tel système pour retenir le token et le renvoyer lors de l'utilisation des webservices pour identifier l'utilisateur (au lieu d'envoeyr à chaque fois les identifiants, on peut garder pendant une durée limité le token)... mais je n'ai jamais réalisé ni même vu comment fonctionner réellement un tel système.

    En réfléchissant rapidement, je me suis dis que je pourrais gérer ça en base de données, avec un table Token qui posséderait un id donné aux applis plus une date d'expiration et qui serait lié à la table Utilisateur. A première vue, comme ça, je dirais que ça fonctionne mais ce n'est probablement pas l'idéal.

    J'ai aussi l'impression de ré-inventer la roue, donc dans un premier temps, je souhaiterais savoir s'il n'y a pas un système efficace déjà présent dans node.js ?
    De même, est-ce qu'il existe un "modèle de conception", une "bonne manière" pour mettre en place un système de token fiable ?
    Sinon, que me conseillez-vous pour créer un petit système de token ?

    Merci d'avance !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Si j'ai bien compris, ce que tu cherches à faire est à l'image des systèmes de sessions utilisés pour le web :
    • L'utilisateur s'authentifie
    • Une session est créee (en base / en mémoire / dans un fichier) avec un ID (token / sessionId) qui l'identifie
    • Un cookie est posé avec ce token
    • Le cookie est renvoyé dans chaque nouvelle requête, ce qui permet de raccrocher la requête à l'utilisateur


    Pour la mise en place d'un système de ce type, tout dépend de ta conception. Comment l'utilisateur accède t-il à tes services ? via une page web, un client lourd (en TCP/HTTP ?), par l'intermédiaire d'un autre serveur ?

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 144
    Points : 118
    Points
    118
    Par défaut
    Oui c'est ça, tu as globalement bien résumé ce que je cherche à faire.
    Petite question d'ailleurs, par rapport à ce que tu as dis : en plus du token/sessionId, on utilise aussi les cookies pour faire le lien ?
    J'ai jamais trop regardé de près ce genre de système, surtout dans le web (comme dit plus haut, j'en ai utilisé un peu sur des applications mobiles où je recevait un token [juste un string] à la connexion, et que je renvoyait ensuite en paramètres aux services nécessitant d'être connecté).


    Pour ce qui est des détails, c'est un client lourd réalisé en C++ et installé sur la machine de l'utilisateur.
    Cette application communiquera avec le serveur Node.js à travers des webservices : en gros, des appels HTTP GET/POST et un retour en JSON.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Les cookie sont automatiquement inclus dans les requêtes HTTP vers le serveur qui les a posés. Donc ce système profite de cette caractéristique pour inclure le token dans un cookie, token qui sera donc automatiquement renvoyé à chaque requête vers le serveur. Côté serveur, il ne reste plus qu'à récupérer le token et à retrouver la session associée.

    Je ne sais pas quelle librairie/framework tu utilise côté client pour envoyer tes requêtes HTTP, mais si elle/il gère les cookies, je te conseille de t'orienter vers cette solution.

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 144
    Points : 118
    Points
    118
    Par défaut
    Merci pour la suggestion, je verrais ça en temps voulu car je ne sais pas encore comment j'enverrais des requêtes HTTP depuis mon client lourd en C++.

    Par contre, le transport du token n'est pas vraiment un problème, c'est plutôt la génération et la gestion du token côté serveur.
    En PHP, je suppose qu'on utilise souvent le système de session, mais en Node.js je ne sais pas s'il existe un tel système.

  6. #6
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    La génération du token en javascript (ou node.js c'est la même) n'est pas tellement un problème, c'est juste que de toutes façons il te faudra le stocker côté serveur. Donc autant le faire de ce côté là dès le début, ce sera bien plus facile et bien plus pratique à manipuler par la suite.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  7. #7
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    1 616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 616
    Points : 3 965
    Points
    3 965
    Par défaut
    tu peux regarder du coté de sencha connect et du coté de Express, qui est bati par dessus Connect, qui te fournit notamment un middleware pour gérer des sessions basées sur cookies
    Émotion
    Infantilisation
    Culpabilisation

    Christophe Alévèque - 18 Mars 2021

  8. #8
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 144
    Points : 118
    Points
    118
    Par défaut
    Je compte effectivement utiliser Express.js, donc c'est encore mieux s'il y a un système pour les sessions et cookies :p

    Donc du coup, on a quand même besoin de stocker les tokens (fichier, base de données, ...) ou Express (ou un autre système) ? De même, est-ce qu'on a besoin de gérer une date de validité ou c'est gérer par le système ?

  9. #9
    Invité
    Invité(e)
    Par défaut
    Express embarque un mécanisme de sessions/cookies. Il y a aussi des modules additionnels qui permettent de sotcker les sessions en base (connect-redis pour une base redis par exemple). Tout dépend de ce que tu veux faire.

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 34
    Points : 68
    Points
    68
    Par défaut
    Salut,
    J'arrive un peu tard...
    J'ai eu à réaliser exactement ce que tu veux faire. AÀ la difference que les clients étaient des Applications mobiles (iOS, WP, Android).
    Utiliser un tel système est évidemment courant en Node.js. C'est le principal système d'authentification.
    Donc tu as le choix:
    Utiliser un framework qui gere cela à ta place (plus ou moins). Regarde du coté de passeports (il est très bien, il intègre different schema, auth locale, Facebook etc)
    Mais il faut bien que tu comprennes ce que tu fais.
    Donc je te conseillerais de le faire toi-même.
    la BDD:
    tu crees une table Session avec comme colonnes:
    -token (String)
    -user_id (une relation avec la table USER)
    -expireDate (Date)
    le Schema:

    1) Le client t'envoie une requête POST du style /auth/connexion {username:"toto", password:"secret"}
    2) Coté Serveur tu checkes les identifiants... Si ils sont corrects tu génères un token, l'associe au user et le stockes dans la table Session.
    3( Puis tu renvoie le token au client (ou tu le stockes dans les cookies au choix)

    Pour les requêtes nécessitant d'être authentifié
    3)Le client envoie la requête en rajoutant le token dans les headers
    4) tu recupere le token et tu verifies qu'il soit bien present et toujours valide (expireDate) dans ta BDD. Si c'est le cas tu donne accès à la ressource. Sinon tu lui renvoie une erreur.

    Ce n'est ni compliqué, ni long à implementer...

    HS: pour ton projet il existe des frameworks plus "haut-niveau" qu'express avec du scaffolding, ORM intégré etc
    Tu as Geddy.js qui est excellent
    ou Sails.js par exemple.
    Ils sont l'equivalent de Rails pour Ruby.
    Perso pour mon projet j'utilise Express+node-orm.
    Si t'as besoin d'aide n'hésites pas

  11. #11
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 144
    Points : 118
    Points
    118
    Par défaut
    Merci pour vos réponses, notamment jason42

    J'avais effectivement pensé à gérer le token d'une manière similaire à ta solution (avec une table en BDD), je cherchais juste à voir s'il y avait d'autres solutions.
    J'avais trouvé une manière sympa mais moins sécurisée : utiliser le module JWT ( https://github.com/nov/json-jwt ) pour signer un payload et le transmettre aux clients.
    Ça avait l'avantage de ne rien avoir à stocker côté serveur, j'ai trouvé ça intéressant mais je partirais probablement plutôt sur une solution en BDD qui éviterais d'avoir un éventuel malin qui trouverait la signature des tokens et qui pourrait faire n'importe quoi

  12. #12
    Membre à l'essai
    Homme Profil pro
    Ingénieur d'étude Géomatique
    Inscrit en
    Mars 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'étude Géomatique

    Informations forums :
    Inscription : Mars 2015
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    Bonjour tout le monde !
    Je débarque un peu 2 ans après la guerre mais j'espère qu'il y aura quand même quelques survivants pour m'aider...

    Voilà j'aurai également besoin créer un système de token mais le problème principal est que je suis un développeur débutant qui doit faire des trucs un peu balèzes...

    J'ai créé un site web en HTML/CSS/Javascript et j'aimerai maintenant implémenter un système de connexion avec session utilisateurs etc. en liens avec ma base de données sous PostgreSQL.

    Je ne connais ni PHP ni Java voilà pourquoi je me tourne vers Node.js (que je ne connais pas non plus mais qui est dans un langage qui m'est familier !) et vers tout ses modules ! Le problème c'est qu'après avoir passé l'aprèm à rechercher comment faire sur internet, je suis un peu perdu avec tous les modules existants pour savoir lesquels sont utiles et lesquels ne le sont pas...

    Parmi ces modules j'envisage timidement d'utiliser :
    - NPM (pour gérer les modules de manière générale du coup)
    - Bower (pour gérer les modules côté client il me semble)
    - Bootstrap (que j'utilise pour mon site et donc pour faire apparaître une modale de connexion)
    - pg (qui permet à priori de gérer la connexion avec mon SGBD postgres)
    - Express (j'ai pas trop compris à quoi ça servait mais tout le monde a l'air de l'utiliser donc ça m'a l'air indispensable)
    - Passeport (qui a l'air dédié à mon besoin à priori...)

    Je ne sais pas trop si tous ces modules sont indispensables, s'ils sont redondants en terme de fonctionnalité, ou si au final je n'aurai besoin que d'un seul d'entre eux...du coup je suis à la recherche de conseils et de pistes !

    Merci d'avance pour votre patience

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème tutoriel Création d'un système RSS
    Par loopback dans le forum XMLRAD
    Réponses: 1
    Dernier message: 14/04/2008, 14h54
  2. création d'un système de plugin
    Par st20085 dans le forum Interfaces Graphiques en Java
    Réponses: 7
    Dernier message: 05/02/2007, 23h37
  3. Réponses: 10
    Dernier message: 29/01/2007, 17h01
  4. [HashTable] Création d'un système de cache : Perte de données
    Par Resyek dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 20/11/2006, 18h29
  5. Création des tables système
    Par tarik75 dans le forum Oracle
    Réponses: 7
    Dernier message: 17/08/2006, 17h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo