risposta-alla-domanda-sullo-sviluppo-web-bd.com

come implementare l'autenticazione di accesso in node.js

Ho questo server nodo in esecuzione:

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);
    }
});

Voglio aggiungere il modulo di login per questo server. Così quando l'utente è autenticato, allora mostrerà.

   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;
    }    
}

nella funzione di query di processo che restituisce i file al client se non viene fornito alcun comando, quindi posso inviare il comando di accesso dal client al server, ma quale server dovrebbe fare quando riceve il comando di accesso con la password nome utente, come dovrebbe consegnare la richiesta di accesso e restituire l'esito positivo o negativo dell'accesso, per scrivere questa parte ho bisogno di aiuto.

quello che ho provato.

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);
    }
}

Si prega di suggerire come posso aggiungere una sessione in questo ho provato ad aggiungere, richiedere la variabile nella funzione di accesso e ho provato a impostare la variabile request.session che dice request.session non è definito.

Si prega di suggerire come posso scrivere questo modulo di accesso che può mantenere l'autenticazione di accesso correttamente per ogni utente.

73
XMen

Ecco come lo faccio con Express.js :

1) Verifica se l'utente è autenticato : ho una funzione middleware denominata CheckAuth che utilizzo su ogni percorso che richiede l'autenticazione dell'utente:

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

Uso questa funzione nei miei percorsi in questo modo:

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

2) Il percorso di accesso:

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 rotta di logout:

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

Se vuoi saperne di più su Express.js controlla il loro sito qui: expressjs.com/en/guide/routing.html Se c'è bisogno di cose più complesse, controlla everyauth (ha molti metodi di autenticazione disponibili, per Facebook, Twitter ecc; buon tutorial qui ).

240
alessioalex

In realtà questa non è davvero la risposta alla domanda, ma questo è un modo migliore per farlo.

Ti suggerisco di usare connect / express come server http, poiché ti fanno risparmiare molto tempo. Ovviamente non vuoi reinventare la ruota. Nel tuo caso la gestione delle sessioni è molto più semplice con connect/express.

Inoltre per l'autenticazione ti consiglio di usare everyauth . Il che supporta molte strategie di autenticazione. Fantastico per un rapido sviluppo.

Tutto ciò può essere facilmente risolto con alcune copie incollate dalla loro documentazione!

6

Per aggiungere alla pseudo-risposta di Farid,

Prendi in considerazione l'utilizzo di Passport.js over everyauth .

Le risposte a questa domanda forniscono alcune informazioni sulle differenze.


Ci sono molti vantaggi nello scaricare l'autenticazione dell'utente su Google, Facebook o un altro sito Web. Se i requisiti della tua applicazione sono tali da poter utilizzare Passport come unico fornitore di autenticazione o insieme al login tradizionale, può rendere l'esperienza più semplice per i tuoi utenti.

3
Luke M Willis

La risposta di @alessioalex è una demo perfetta per l'utente nuovo nodo. Tuttavia, è difficile scrivere il middleware checkAuth in tutte le rotte tranne il login, quindi è meglio spostare checkAuth da ogni rotta a una voce con app.use. Per esempio:

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

Ho provato questa risposta e non ha funzionato per me. Sono anche un principiante nello sviluppo web e ho preso lezioni in cui ho usato mlab ma preferisco analizzare ed è per questo che ho dovuto cercare la soluzione più adatta. Ecco la mia attuale soluzione usando parse su expressJS.

1) Verifica se l'utente è autenticato: ho una funzione middleware chiamata isLoggin che utilizzo su ogni percorso che richiede l'autenticazione dell'utente:

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

Uso questa funzione nei miei percorsi in questo modo:

  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 rotta di accesso:

  // 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) Il percorso di logout:

 // 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');
   });

Questo ha funzionato molto bene per me e ho fatto un riferimento completo alla documentazione qui https://docs.parseplatform.org/js/guide/#users

Grazie a @alessioalex per la sua risposta. Ho aggiornato solo con le ultime pratiche.

1
felix