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