web-dev-qa-db-fra.com

comment implémenter l'authentification de connexion dans node.js

J'ai ce serveur de noeud en cours d'exécution:

var server=http.createServer(function(request, responsehttp) {
    if (request.method == 'POST') {
        var body = '';
        request.on('data', function (data) {
            body += data;
        });
        request.on('end', function () {
            var POST = qs.parse(body);
            processquery(POST, request, responsehttp);
        });
    } else {
        var url_parts = url.parse(request.url, true);
        var query = url_parts.query;
        console.log(query);
        processquery(query, request, responsehttp);
    }
});

Je veux ajouter un formulaire de connexion pour ce serveur. Si l'utilisateur est authentifié, il s'affichera.

   function processquery(query, request, responsehttp){
    var returnResult = function (data){
        responsehttp.end(JSON.stringify(data));
    };

    if (!query.command) {
        fileprocess(request, responsehttp);
    }
    responsehttp.writeHead(200, {"Content-Type": "application/json"});
    switch(query.command) {
        case 'logout':
            logout(query, returnResult);
            break;
        case 'login':
            login(query, returnResult);
            break;
    }    
}

dans la fonction de requête de processus renvoyant les fichiers au client si aucune commande n'est donnée, je peux donc envoyer la commande de connexion de client à serveur, mais quel serveur doit-il faire lorsqu'il reçoit la commande de connexion avec le nom d'utilisateur mot de passe, comment il doit transmettre la demande de connexion et renvoyer le succès ou l'échec de la connexion, pour écrire cette partie, j'ai besoin d'aide.

ce que j'ai essayé.

function login(request, callback) {
    if(request.username==users[request.username] && request.password==users[request.username].password) {
        users[request.username].auth=true;
        var data = {result:'success','message':'login successful'};
        callback(data);
    } else {
        var data = {result:'error','message':'login incorrect'};
        callback(data);
    }
}

S'il vous plaît suggérer comment puis-je ajouter une session dans ce que j'ai essayé d'ajouter, demande de variable dans la fonction de connexion et essayé de définir la variable request.session, il est dit que request.session est indéfinie.

S'il vous plaît suggérer comment puis-je écrire ce module de connexion qui peut maintenir l'authentification de connexion correctement pour chaque utilisateur.

73
XMen

Voici comment je le fais avec Express.js :

1) Vérifiez si l'utilisateur est authentifié : J'ai une fonction middleware appelée CheckAuth que j'utilise sur chaque route nécessitant l'authentification de l'utilisateur:

function checkAuth(req, res, next) {
  if (!req.session.user_id) {
    res.send('You are not authorized to view this page');
  } else {
    next();
  }
}

J'utilise cette fonction dans mes itinéraires comme ceci:

app.get('/my_secret_page', checkAuth, function (req, res) {
  res.send('if you are viewing this page it means you are logged in');
});

2) L'itinéraire de connexion:

app.post('/login', function (req, res) {
  var post = req.body;
  if (post.user === 'john' && post.password === 'johnspassword') {
    req.session.user_id = johns_user_id_here;
    res.redirect('/my_secret_page');
  } else {
    res.send('Bad user/pass');
  }
});

3) L'itinéraire de déconnexion:

app.get('/logout', function (req, res) {
  delete req.session.user_id;
  res.redirect('/login');
});      

Si vous voulez en savoir plus sur Express.js, visitez leur site ici: expressjs.com/fr/guide/routing.html Si vous avez besoin de choses plus complexes, faites un achat everyauth (Il y a beaucoup de méthodes d'authentification disponibles, pour Facebook, Twitter, etc.; bon tutoriel dessus ici ).

240
alessioalex

En réalité, ce n’est pas vraiment la réponse à la question, mais c’est une meilleure façon de le faire.

Je vous suggère d'utiliser connect / express en tant que serveur http, car ils vous font gagner beaucoup de temps. Vous ne voulez évidemment pas réinventer la roue. Dans votre cas, la gestion de session est beaucoup plus facile avec connect/express.

A côté de cela pour l'authentification, je vous suggère d'utiliser everyauth . Ce qui supporte beaucoup de stratégies d'authentification. Génial pour le développement rapide.

Tout cela peut être facilement descendu avec un copier-coller de leur documentation!

6

Pour ajouter à la pseudo-réponse de Farid,

Pensez à utiliser Passport.js sur everyauth .

Les réponses à cette question permettent de mieux comprendre les différences.


Le déchargement de votre authentification d'utilisateur sur Google, Facebook ou un autre site Web offre de nombreux avantages. Si les exigences de votre application sont telles que vous pouvez utiliser Passport en tant que fournisseur unique d'authentification ou à côté d'un login traditionnel, l'expérience peut être simplifiée pour vos utilisateurs.

3
Luke M Willis

@alessioalex answer est une démonstration parfaite pour les nouveaux utilisateurs de nœuds. Quoi qu'il en soit, il est difficile d'écrire le middleware checkAuth dans toutes les routes, à l'exception de la connexion. Il est donc préférable de déplacer le checkAuth de chaque route vers une entrée avec app.use. Par exemple:

function checkAuth(req, res, next) {
  // if logined or it's login request, then go next route
  if (isLogin || (req.path === '/login' && req.method === 'POST')) {
    next()
  } else {
    res.send('Not logged in yet.')
  }
}

app.use('/', checkAuth)
2
Chang

J'ai essayé cette réponse et cela n'a pas fonctionné pour moi. Je suis aussi un débutant en développement Web et j'ai suivi des cours dans lesquels j'ai utilisé mlab, mais je préfère analyser, ce qui explique pourquoi j'ai dû rechercher la solution la plus appropriée. Voici ma propre solution actuelle utilisant parse sur ExpressJS.

1) Vérifiez si l’utilisateur est authentifié: j’ai une fonction de middleware nommée isLogginIn que j’utilise sur chaque route nécessitant l’authentification de l’utilisateur:

 function isLoggedIn(req, res, next) {
 var currentUser = Parse.User.current();
 if (currentUser) {
     next()
 } else {
     res.send("you are not authorised");
 }
}

J'utilise cette fonction dans mes itinéraires comme ceci:

  app.get('/my_secret_page', isLoggedIn, function (req, res) 
  {
    res.send('if you are viewing this page it means you are logged in');
  });

2) La route de connexion:

  // handling login logic
  app.post('/login', function(req, res) {
  Parse.User.enableUnsafeCurrentUser();
  Parse.User.logIn(req.body.username, req.body.password).then(function(user) {
    res.redirect('/books');
  }, function(error) {
    res.render('login', { flash: error.message });
  });
});

3) L'itinéraire de déconnexion:

 // logic route
  app.get("/logout", function(req, res){
   Parse.User.logOut().then(() => {
    var currentUser = Parse.User.current();  // this will now be null
    });
        res.redirect('/login');
   });

Cela a très bien fonctionné pour moi et j'ai fait une référence complète à la documentation ici https://docs.parseplatform.org/js/guide/#users

Merci à @alessioalex pour sa réponse. J'ai seulement mis à jour avec les dernières pratiques.

1
felix