Bonjour tout le monde,

J'aimerais revoir mon système d'authentification actuel pour avoir quelques chose de plus sécurisé et j'aimerais y réfléchir avec vous ;)
Actuellement, j'ai un serveur (NodeJS) qui traite les requêtes (eh c'est son rôle après tout !) et un client en VueJS.
Lorsque le client souhaite accéder à l'application, il envoi une requête login et password (axios) sur le serveur et celui-ci stock un token dans la base SQL puis retourne le token au client.
A chaque requête, le schéma suivant est appliqué :

  • le client envoi une requête au serveur via axios (ex: "/blog/1" et en paramètre le token)
  • le serveur regarde si le token existe dans une base SQL et sinon retourne un état 401.
  • si oui, le serveur traite la demande et le retourne au client
  • Réception d'une réponse, VueJS vérifie si l'état n'est pas 401, sinon affiche la réponse.

J'ai découvert express-session qui permet d'éviter d'écrire du code pour rien sur VueJS, il me semble, et permet a priori de sécurisé plus facilement les transaction !?

Avez-vous un retour d'expérience sur le sujet ?
Me conseillez-vous une manipulation particulière afin de sécuriser mes transactions entre le serveur et le client ?

Merci pour vos réponses :)

5 réponses


Salut,

Si tu souhaites sécuriser tes transactions client <-> serveur, tu peux te tourner vers la lib passportjs ;)

express-session est déprécié je crois non? sinon passport est pas mal mais pour avoir fait la partie passport a la mains c'est pas trop compliqué et si tu veux ajouter l'auth via service externe (google, etc) là je te conseille de la faire a la main (c'est juste 3 requêtes xhr (en gros))

Jielde
Auteur

Justement hier j'étais sur passportjs,
j'ai eu des problème pour la version local, le LocalStrategy n'était jamais appelé.......je testerais de nouveau ce soir.

Passportjs parrait être une bonne solution surtout si plus tard je souhaite y couplé facebook, google, autre....

Jielde
Auteur

Salut,

Bon j'ai testé passportjs et faut dire qu'il correspond bien, en plus je peux facilement ajouter facebook, google, etc... sans changer trop changer le code.

Mais j'ai,encore, un problème. J'ai des lacunes en javascript mais je les corriges ;)
Actuellement mon j'utilise nodejs avec Express, router, ...

j'ai un fichier server.js, c'est le fichier de base

/* server.js */

var express           =     require('express')
  , helmet               =     require('helmet')
  , util                      =     require('util')
  , cors                    =     require('cors')
  , passport            =     require('passport')
  , LocalStrategy    =     require('passport-local').Strategy
  , session               =     require('express-session')
  , cookieSession   =     require('cookie-session')
  , cookieParser     =     require('cookie-parser')
  , bodyParser        =     require('body-parser')
  , app                      =     express();

var app = express();

app.enable('trust proxy');
app.use(helmet()) // Désavtive l'en-tête avec Helmet pour sécuriser un minimum le serveur, je crois....
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.disable('x-powered-by')

app.use(passport.initialize());
app.use(passport.session());

app.use(session({
  secret: 'mon super code',
  resave: true,
  saveUninitialized: true
}));

app.use(cors({
    origin:['http://127.0.0.1:8080'],
    methods:['GET','POST'],
    credentials: true // enable set cookie
}));

app.use(function(req, res, next) {
  res.header('Access-Control-Allow-Credentials', true);
  res.header('Access-Control-Allow-Methods', 'GET,HEAD,PUT,POST,DELETE,OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type,x-access-token');
  next();
});

require('./src/routes')(app);

var server = app.listen(8081, function () {
  var host = server.address().address
  var port = server.address().port
  console.log("Server listening at http://%s:%s", host, port)
})

un fichier routes

/*  routes.js */
var login    = require('./controllers/login')
    , users   = require('./controllers/users')

module.exports = function(app, passport){
    /* LOGIN */
    app.post('/login', login.verifLogin)

    /*  USERS  */
    app.get('/users', residences.findAll);
    app.get('/users/:id', residences.findById);
    // app.post('/users', users.add);
    // app.put('/users/:id', users.update);
    // app.delete('/users/:id', users.delete);

    /*  HOME  */
    app.get('/', function(req, res) {
        res.send('Hello World\n');
    });
};

Et le fichier login.js

/*  login.js */
var db        =     require('../db.js')

exports.verifLogin = function(req, res){
  let username = req.body.username
  let password = req.body.password

  // Comment faire pour que ceci fonctionne ???
  /*passport.authenticate('pass-local'), function(req, res) {
    if ( req.session.passport.user != null ) {
      console.log('Ok')
      console.log(req.user)
      console.log(req.isAuthenticated())
      res.send('ok')
    } else {
      console.log('not found')
      res.send('401')
    }
  }*/

  db.mysql.query('SELECT * from users WHERE email = ?', [username])
  .then((rows) => {
    var data = `{
      "results": {
        "user": {
          "id": "`+rows[0].id+`",
          "gender": `+JSON.stringify(rows[0].gender)+`,
          "name": {
            "title": `+JSON.stringify(rows[0].name_title)+`,
            "first": `+JSON.stringify(rows[0].name_first)+`,
            "last": `+JSON.stringify(rows[0].name_last)+`
          },
          "location": {
            "street": `+JSON.stringify(rows[0].location_street)+`,
            "city": `+JSON.stringify(rows[0].location_city)+`,
            "state": `+JSON.stringify(rows[0].location_state)+`,
            "postcode": `+JSON.stringify(rows[0].location_postcode)+`,
            "formatted_address": `+JSON.stringify(rows[0].location_formatted_address)+`
          },
          "email": `+JSON.stringify(rows[0].email)+`,
          "token": "`+'fdsdddsfds'+`",
          "phone": "`+rows[0].phone+`",
          "picture": {
            "large": "`+rows[0].picture_large+`",
            "medium": "`+rows[0].picture_medium+`",
            "thumbnail": "`+rows[0].picture_thumbnail+`"
          }
        }}}`;

      res.writeHead(200, {'Content-Type': 'application/json'});
      res.end(data);
  })
  .catch((error) => {
    console.log('Erreur verifLogin State 1', error)
    res.sendStatus(204)
    queryError = true
  })
};

J'aimerais créer un nouveau fichier << passport.js >> et y mettre ceci :

/* passport-config.js  */
var passport          =     require('passport')
  , LocalStrategy     =     require('passport-local').Strategy
  , mysql             =     require('mysql')
  , config            =     require('../configuration/config')

  //Define MySQL parameter in Config.js file.
  var connection = mysql.createConnection({
    host     : config.host,
    user     : config.username,
    password : config.password,
    database : config.database
  });

  //Connect to Database only if Config.js parameter is set.
  if(config.use_database==='true')
  {
      connection.connect();
  }

  // Passport session setup.
  passport.serializeUser(function(user, done) {
    console.log('serializeUser')
    //var user = { id: 1, username: 'jack', password: 'secret', displayName: 'Jack', emails: [ { value: 'jack@example.com' } ] }
    done(null, user);
  });

  passport.deserializeUser(function(user, done) {
    console.log(user.id)
    //var obj = { id: 1, username: 'jack', password: 'secret', displayName: 'Jack', emails: [ { value: 'jack@example.com' } ] }
    done(null, user);
  });

  passport.use(new LocalStrategy({
    // by default, local strategy uses username and password, we will override with email
    usernameField : 'email',
    passwordField : 'password'
  },
  function(username, password, done) { // callback with email and password from our form
    console.log('Search user: ' + username)
    connection.query("SELECT * from `users` where `email` = '"+username+"'",function(err,rows,fields){
      console.log('DEBUG: Users query')
      if(err) throw err;
      if(rows.length===0)
      {
        console.log("There is no such user, adding now");
      }
      else
      {
        console.log("User found in database");
        return done(null, rows[0]);
      }
      });   
  }));

Mais, je ne comprends pas comment faire pour que mon fichier login.js accepte ceci.

Une idée car cela fais plusieurs jours que je sèche dessus ?

Merci à vous

le require devrait suffire? un petit exemple :

const passport = require('./passport')
// ou ./passport est le chemin vers ton fichier passport.js