1

Je fais un programme web nodejs et j'ai besoin d'une authentification locale, google et facebook. Pour google et facebook je n'ai pas déjà un DNS pour retourner avec succès. Lorsque je fais une authentification locale de serveur continuer à penser et dit qu'ils n'ont pas de réponse. C'est mon server.js: (s'il vous plaît aidez-moi)Authentification Nodejs

var express = require('express'), 
flash = require('connect-flash') 
exphbs = require('express-handlebars'), 
logger = require('morgan'), 
cookieParser = require('cookie-parser'), 
bodyParser = require('body-parser'), 
methodOverride = require('method-override'), 
session = require('express-session'), 
passport = require('passport'), 
LocalStrategy = require('passport-local').Strategy, 
mongoose = require('mongoose'); 
GoogleStrategy = require('passport-google').Strategy, 
FacebookStrategy = require('passport-facebook').Strategy, 
LocalStrategy = require('passport-local').Strategy 
Schema = mongoose.Schema, 
bcrypt = require('bcrypt'), 
util = require('util') 
SALT_WORK_FACTOR = 10; 
FACEBOOK_APP_ID = "944091472291356" 
FACEBOOK_APP_SECRET = [removed]; 
User = require('./models/user.js'); 
login = require('./views/layouts/userlogin'); 
signin = require('./views/signin'); 
var Auth0Strategy = require('passport-auth0'); 
auth = require('basic-auth'); 
mysql = require('mysql') 


//Creating connection to data base 
var config = require('./config.js'), //config file contains all tokens and other private info 
funct = require('./functions.js'), //funct file contains our helper functions for our Passport and database work 
app = express(); 
//Base de dados mongo 
module.exports = mongoose.model('User', UserSchema); 
mongoose.connect("mongodb://localhost:27017/MyDatabase", function(err, db){ 
if(!err){ 
console.log("Ligado ao servidor mongoDB"); 
} else console.log(err); 
}); 

UserSchema = function(candidatePassword, cb) { 
bcrypt.compare(candidatePassword, this.password, function(err, isMatch) { 
if (err) return cb(err); 
cb(null, isMatch); 
}); 
}; 


var Schema = mongoose.Schema; 
var UserDetail = new Schema({ 
username: String, 
password: String 
}, { 
collection: 'userInfo' 

}); 

var ricardo = new User ({ 
username : 'ricardo', 
password : 'rolo', 
hasCreditCookie: true 
}); 


var UserDetails = mongoose.model('userInfo', UserDetail); 
//We will be creating these two files shortly 
var config = require('./config.js'), //config file contains all tokens and other private info 
funct = require('./functions.js'); //funct file contains our helper functions for our Passport and database work 
var UserSchema = new Schema({ 
username: { type: String, required: true, index: { unique: true } }, 
password: { type: String, required: true } 
}); 
UserSchema.pre('save', function(next) { 
var user = this; 
// only hash the password if it has been modified (or is new) 
if (!user.isModified('password')) return next(); 
// generate a salt 
bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) { 
if (err) return next(err); 
// hash the password using our new salt 
bcrypt.hash(user.password, salt, function(err, hash) { 
if (err) return next(err); 
// override the cleartext password with the hashed one 
user.password = hash; 
next(); 
}); 
}); 
}); 
function findById(id, fn) { 
var idx = id - 1; 
if (users[idx]) { 
fn(null, users[idx]); 
} else { 
fn(new Error('User ' + id + ' does not exist')); 
} 
} 
function findByUsername(username, fn) { 
for (var i = 0, len = users.length; i < len; i++) { 
var user = users[i]; 
if (user.username === username) { 
return fn(null, user); 
} 
} 
return fn(null, null); 
} 
var UserDetails = mongoose.model('userInfo', UserDetail); 
//new schema 
var Schema = mongoose.Schema; 
var UserDetail = new Schema({ 
username: String, 
password: String 
}, { 
collection: 'userInfo' 
}); 

////////////////////////////////Local - PASSPORT by:zezão xD 

passport.use(new LocalStrategy(function(username,password,done){ 
    connection.query("select * from BdClientes.Users where username='"+username+"'  ",function(err,user){ 
    if(err) 
    { 
     return done(err);   
    } 
    if(!user) 
    { 
     return done(null,false,{message: 'Incorrect user name'});   
    } 
    if(user.password != password) 
    { 
     return done(null,false,{message: 'Incorrect password'}); 
    } 

    return done(null,user);  

    }); 
} 
)); 
app.post('/home', passport.authenticate('signin',{successRedirect: '/home', failureRedirect: '/signin', failureFlash: true })); 

passport.serializeUser(function(user, done) { 
    done(null, user._id); 
}); 

passport.deserializeUser(function(id, done) { 
    User.findById(id, function(err, user) { 
    done(err, user); 
    }); 
}); 

// passport/signin.js 
passport.use('local-signin', new LocalStrategy({ 
    username : 'username', 
    password : 'password', 
    passReqToCallback : true 
    }, 
    function(req, username, password, done) { 
    // verifica no mongo se o nome de usuário existe ou não 
    User.findOne({ 'username' : username }, 
     function(err, username) { 
     // Em caso de erro, retorne usando o método done 
     if (err) 
      return done(err); 
     // Nome de usuário não existe, logar o erro & redirecione de volta 
     if (!user){ 
      console.log('Usuário não encontrado para usuário '+username); 
      return done(null, false, 
       req.flash('message', 'Usuário não encontrado.')); 
     } 
     // Usuário existe mas a senha está errada, logar o erro 
     if (!isValidPassword(user, password)){ 
      console.log('Senha Inválida'); 
      return done(null, false, 
       req.flash('message', 'Senha Inválida')); 
     } 
     // Tanto usuário e senha estão corretos, retorna usuário através 
     // do método done, e, agora, será considerado um sucesso 
     return done(null, user); 
     } 
    ); 
})); 



//LOCAL signin 
passport.use('local-signin', new LocalStrategy({ 
usernameField : 'username', 
passwordField : 'password', 
passReqToCallback : true // allows us to pass back the entire request to the callback 
}, 
function(req, username, password, done) { 
process.nextTick(function() { 
User.findOne({ 'local.username' : username }, function(err, user) { 
if (err) 
return done(err); 
if (user) { 
return done(null, false, req.flash('signinMessage', 'That email is already taken.')); 
} else { 
// if there is no user with that email 
// create the user 
var newUser = new User(); 
// set the user's local credentials 
newUser.local.email = email; 
newUser.local.password = newUser.generateHash(password); 
// save the user 
newUser.save(function(err) { 
if (err) 
throw err; 
return done(null, newUser); 
}); 
} 
}); 
}); 
process.nextTick(findOrCreateUser); 
})); 



// Use the LocalStrategy within Passport to register/"signin" users. 
passport.use('signin', new LocalStrategy(
{passReqToCallback : true}, //allows us to pass back the request to the callback 
function(req, username, password, done) { 
funct.signin(username, password) 
.then(function (user) { 
if (user) { 
console.log("REGISTERED: " + user.username); 
req.session.success = 'You are successfully registered and logged in ' + user.username + '!'; 
done(null, user); 
} 
if (!user) { 
console.log("COULD NOT REGISTER"); 
req.session.error = 'That username is already in use, please try a different one.'; //inform user could not log them in 
done(null, user); 
} 
}) 
.fail(function (err){ 
console.log(err.body); 
}); 
} 
)); 
// Simple route middleware to ensure user is authenticated. 
function ensureAuthenticated(req, res, next) { 
if (req.isAuthenticated()) { return next(); } 
req.session.error = 'Please sign in!'; 
res.redirect('/signin'); 
} 
////FACEBOOK PASSPORT 
passport.use(new FacebookStrategy({ 
clientID: FACEBOOK_APP_ID, 
clientSecret: FACEBOOK_APP_SECRET, 
callbackURL: "http://localhost:5000/auth/facebook/callback" 
}, 
function(accessToken, refreshToken, profile, done) { 
process.nextTick(function() { 
return done(null, profile); 
}); 
} 
)); 
//GOOGLE 
passport.use(new GoogleStrategy({ 
returnURL : 'http://127.0.0.1:5000/auth/google', 
realm: 'http://127.0.0.1:5000/' 
}, 
function(identifier, profile, done) { 
User.findOrCreate({ openId: identifier }, function(err, user) { 
done(err, user); 
}); 
} 
)); 
////////////////////////////////////////EXPRESS 
// Configure Express 
app.use(logger('combined')); 
app.use(cookieParser()); 
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(bodyParser.json()); 
app.use(methodOverride('X-HTTP-Method-Override')); 
app.use(session({secret: 'supernova', saveUninitialized: true, resave: true})); 
app.use(passport.initialize()); 
app.use(passport.session()); 
// Configure express to use handlebars templates 
var hbs = exphbs.create({ 
defaultLayout: 'main', //we will be creating this layout shortly 
}); 
app.engine('handlebars', hbs.engine);//handlebars templates 
app.set('view engine', 'handlebars');// 
//// app.set('view engine', 'ejs');//EJS templates 
//app.use(app.mountpath); 
// Session-persisted message middleware 
app.use(function(req, res, next){ 
var err = req.session.error, 
msg = req.session.notice, 
success = req.session.success; 
delete req.session.error; 
delete req.session.success; 
delete req.session.notice; 
if (err) res.locals.error = err; 
if (msg) res.locals.notice = msg; 
if (success) res.locals.success = success; 
next(); 
}); 
//Requerido para o passport 
app.use(session({ secret: 'eutentoetento' })); // session secret 
app.use(passport.initialize()); 
app.use(passport.session()); // persistent login sessions 
app.use(flash()); // use connect-flash for flash messages stored in session 




///////////////////////////////////////////ROUTES 
//displays our homepage 
app.get('/', function(req, res){ 
res.render('./home', {user: req.user}); 
}); 
//login// 
app.get('/login', function(req, res) { 
res.render('login', { user: req.user, message: req.flash('error') }); 
}); 
//sends the request through our local login/signin strategy, and if successful takes user to homepage, otherwise returns then to signin page 
app.post('/login', function(req, res, next) { 
    passport.authenticate('home', function(err, user, info) { 

    // Error Check 
    if(err) { return next(err); 
} 
    // Json Response reflecting authentication status 
    if(!user) { 
     return res.send({success:false, message: 'authentication failed '}) 
    } 
    // Success 
    return res.send({succes:true, message: 'authentication succeeded'}) 
    }) 
}) 



//SIGNIN// 
app.get('/signin', function(req, res){ 
res.render('signin', { message: req.flash('signinMessage') });; 
}); 
app.post('/signin', passport.authenticate('local-signin', { 
successRedirect : '/profile', // redirect to the secure profile section 
failureRedirect : '/signin', // redirect back to the signin page if there is an error 
failureFlash : true // allow flash messages 
})); 
//PROFILE 
app.get('profile', isLoggedIn, function(req, res) { 
res.render('profile', { 
user: req.user // tira o user da sessao e passa para o template 
}); 
}); 
//LOGOUT 
//logs user out of site, deleting them from the session, and returns to homepage 
app.get('/logout', function(req, res){ 
var name = req.user.username; 
console.log("LOGGIN OUT " + req.user.username) 
req.logout(); 
res.redirect('/'); 
req.session.notice = "You have successfully been logged out " + name + "!"; 
}); 
//FB 
app.use(session({ secret: 'keyboard cat' })); 
app.get('/auth/facebook', 
passport.authenticate('facebook', { failureRedirect: '/login' }), 
function(req, res) { 
res.redirect('/'); 
}); 
app.get('/account', ensureAuthenticated, function(req, res){ 
res.render('account', { user: req.user }); 
}); 
app.get('/logout', function(req, res){ 
req.logout(); 
res.redirect('/'); 
}); 
<pre> 
//google routes// 
app.get('/auth/google', passport.authenticate('google')); 
app.get('/auth/google/return', 
passport.authenticate('google', { successRedirect: '/', 
failureRedirect: '/login' })); 
// route middleware to make sure a user is logged in 
function isLoggedIn(req, res, next) { 
// if user is authenticated in the session, carry on 
if (req.isAuthenticated()) 
return next(); 
// if they aren't redirect them to the home page 
res.redirect('/'); 
} 
//////////////////////////////////LAUCH 
//===============PORT================= 
var port = process.env.PORT || 5000; //select your port or let it pull from your .env file 
app.listen(port); 
console.log("listening on " + port + "!"); 
function ensureAuthenticated(req, res, next) { 
if (req.isAuthenticated()) { return next(); } 
res.redirect('/login'); 
} 
+3

Avez-vous vraiment l'intention d'afficher vos identifiants de développeur Facebook ici? – jfriend00

+3

Beaucoup trop de code ici. N'envoyez que le code pertinent et affinez la portée de votre question. –

+0

Vous devez utiliser un outil comme ngrok (https://ngrok.com/) pour enregistrer un domaine public avec facebook pour définir un rappel uri pendant le développement. – Yousef

Répondre

2

nœud a un grand paquet OAuth2 en utilisant « googleapis » qui fait la quasi-totalité de l'authentification pour vous (je l'ai utilisé pour accéder à mon calendrier, mais vous pouvez utiliser pour d'autres choses aussi).

utiliser comme si:

var google = require('googleapis');<br/> 
var OAuth2 = google.auth.OAuth2; 

puis:

var oauth2Client = new OAuth2("clientID", "client_secret", "redirectURL"); 

Vous pouvez obtenir votre clientid et client_secret de votre compte Google (je pense que vous avez besoin d'un compte développeur qui est gratuit). L'URL de redirection est l'endroit où vous voulez aller après l'authentification.

Consultez leur page npm pour plus de détails. Je suis sûr qu'il y a quelque chose de similaire pour facebook. Utiliser cette bibliothèque fait tout ressembler à google aussi, donc vous n'avez pas l'air de pirater quelque chose. Vous pouvez également lire sur oauth2 car c'est la dernière norme et la plupart des services Web le supportent.

3

Puisque vous utilisez déjà Passport.js pour l'authentification locale, vous devriez jeter un oeil à ses plug-ins (appelées stratégies) pour se connecter à différents services en utilisant OAuth ou OpenID, y compris Facebook, Twitter et Google. Here est un très bon tutoriel (with updates for express 4.0) qui explique comment faire ces types d'authentification.

Aussi, je recommande de mettre ces schémas dans leurs propres fichiers, pour plus de clarté.