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

j'ai ce serveur de noeud qui tourne:

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 le formulaire de connexion pour ce serveur .ainsi, lorsque l'utilisateur est authentifié, il apparaîtra .

   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 retournant les fichiers au client si aucune commande n'est donnée , je peux donc envoyer la commande login du client au serveur, mais ce que le serveur devrait faire quand il reçoit la commande login avec le mot de passe username , comment il devrait transmettre la demande de login et retourner le succès ou l'échec de 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 , la variable request dans la fonction login et essayé de définir la requête.la variable de session indique requête.la session n'est pas défini .

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 .

72
demandé sur Michael J. Calkins 2011-11-03 10:07:23

5 réponses

Voici comment je fais avec Express.js :

1) vérifier si l'utilisateur est authentifié : j'ai une fonction middleware appelée CheckAuth que j'utilise sur chaque route qui nécessite 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 routes 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) la route 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) La déconnexion de la route:

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

si vous voulez en savoir plus sur Express.js consulter leur site ici: expressjs.com/en/guide/routing.html S'il y a besoin de choses plus complexes, consultez everyauth (il a beaucoup de méthodes auth disponibles, pour facebook, twitter, etc; bon tutoriel sur it ici ).

236
répondu alessioalex 2016-11-09 17:11:54

en Fait, ce n'est pas vraiment la réponse à la question, mais ce est une meilleure façon de le faire.

je vous suggère d'utiliser se connecter / express comme serveur http, car ils vous faire économiser beaucoup de temps. Tu ne veux évidemment pas réinventer la roue. Dans votre cas, la gestion des sessions est beaucoup plus facile avec connect/express.

à 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 un développement rapide.

tout cela peut être facilement down avec un certain collage de copie de leur documentation!

5
répondu Farid Nouri Neshat 2011-11-03 09:58:41

ajouter À Farid de pseudo-réponse,

envisager d'utiliser le passeport .js plus everyauth .

Les réponses à cette question de donner un aperçu des différences.


il y a de nombreux avantages à décharger votre authentification utilisateur sur Google, Facebook ou un autre site web. Si les exigences de votre demande sont telles que vous puissiez utiliser Passport comme votre seul fournisseur d'authentification ou en parallèle avec la connexion traditionnelle, cela peut rendre l'expérience plus facile pour vos utilisateurs.

2
répondu Luke M Willis 2017-05-23 12:26:32

@alessioalex answer est une démo parfaite pour l'utilisateur de node frais. Mais de toute façon, il est difficile d'écrire des middleware checkAuth dans toutes les routes sauf login, il est donc préférable de déplacer le checkAuth de chaque route à une entrée avec l'application.utiliser. 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
répondu Chang 2017-08-10 07:28:31

j'ai essayé cette réponse et ça n'a pas marché pour moi. Je suis également un internaute novice sur le développement web et j'ai pris des cours où j'ai utilisé mlab mais je préfère parse, c'est pourquoi j'ai dû chercher la solution la plus appropriée. Voici ma propre solution actuelle en utilisant parse sur expressJS.

1)vérifiez si l'utilisateur est authentifié: j'ai une fonction middleware appelée isLogginIn que j'utilise sur chaque route qui nécessite 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 routes 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) la route de la 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 référence complète à la documentation ici https://docs.parseplatform.org/js/guide/#users

merci à @alessioalex pour sa réponse. Je n'ai mis à jour que les pratiques les plus récentes.

1
répondu felix 2018-08-19 22:35:58