Je suis assez nouveau pour utiliser un passeport pour l'authentification sur un noeud, d'où le lot d'extraits de code
mon serveur est configuré comme:
var router = require('./app/config/routes');
var googleStrategy = require('./app/config/passport');
var session = require("express-session");
var passport = require('passport');
app.use(session({secret : '<secret-key>'}));
app.use(passport.initialize());
app.use(passport.session());
googleStrategy(passport);
mes itinéraires sont configurés comme
module.exports = function(app, passport) {
app.get('/auth/google', function() {
passport.authenticate('google', {scope: ['profile', 'email']});
});
app.get('/auth/google/callback', function() {
passport.authenticate('google', {
successRedirect: '/profile',
failureRedirect: '/fail'
});
});
.... ALSO configured /profile and /fail
};
mon passeport est configuré comme
passport.serializeUser(function(user, callback){
console.log('serializing user.');
callback(null, user);
});
passport.deserializeUser(function(user, callback){
console.log('deserialize user.');
callback(null, user);
});
var processRequest = function(token, refreshToken, profile, callback){
process.nextTick(function(){
console.log('id : '+ profile.id);
console.log('name :'+ profile.displayName);
console.log('email :' + profile.emails);
console.log('token : '+ token);
});
};
passport.use(new GoogleStrategy({
clientID: 'client ID',
clientSecret : 'client SECRET',
callbackURL : 'http://127.0.0.1:8080/auth/google/callback',
realm : 'http://127.0.0.1:8080'
}, processRequest));
Problème: en allant à /auth/google
, je n’obtiens jamais d’écran de confirmation. Que devrais-je regarder?
changer les routes vers la configuration montrée ci-dessous le faisait fonctionner
app.get('/auth/google',
passport.authenticate('google', {scope: ['profile', 'email']})
);
app.get('/auth/google/callback',
passport.authenticate('google', {
successRedirect: '/profile',
failureRedirect: '/fail'
})
);
Actuellement, le protocole d’authentification et d’authentification OAUTH2 est bien pris en charge par google. Il est préférable d’utiliser le même. Voici la documentation de google à ce sujet .Utilisez 'passport-google-oauth' module. Voici la mise en œuvre. Il devrait s'agir de la configuration des objets d'application. Vérifiez également que l'objet oauth2strategy est utilisé dans le module passport-google-oauth. Consultez également les portées de l'enregistrement de la route app.get.
var googleStrategy = require('passport-google-oauth').OAuth2Strategy;
app.configure(function() {
app.set('views', './views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(express.session({secret:'MySecret'}));
app.use(passport.initialize());
app.use(passport.session());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static('./public'));
});
app.get('/auth/google', select.passport.authenticate('google',{scope: 'https://www.googleapis.com/auth/plus.me https://www.google.com/m8/feeds https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile'}));
app.get('/auth/google/callback', function() {
passport.authenticate('google', {
successRedirect: '/profile',
failureRedirect: '/fail'
});
});
app.get('/logout', function (req, res) {
req.logOut();
res.redirect('/');
});
Mais avant de créer une nouvelle stratégie, allez à la console développeur de Google et obtenez le clientID et le secret. Voici les étapes
puis accédez aux informations d'identification (sous API), puis cliquez sur Créer un nouvel ID client , et enregistrez les domaines et rappelez-les pour votre application (configurez le domaine pour qu'il soit localhost), voici son instantané! 5.Vous obtiendrez alors votre nouvelle identité et votre secret. Utilisez-les pour créer la nouvelle stratégie
passport.use(new googleStrategy({
clientID: '<TheNewclientID>',
clientSecret: '<The New Secret>',
callbackURL: "http://locahost:8080/auth/google/callback"
},
function (accessToken, refreshToken, profile, done) {
console.log(profile); //profile contains all the personal data returned
done(null, profile)
}
));
6. maintenant sérialiser et désérialiser
passport.serializeUser(function(user, callback){
console.log('serializing user.');
callback(null, user.id);
});
passport.deserializeUser(function(user, callback){
console.log('deserialize user.');
callback(null, user.id);
});
lancez le serveur et allez sur localhost: 8080/auth/google (n'utilisez pas 127.0.0.1:8080 au lieu de locahost) .Cela devrait le faire fonctionner :)
[Autres liens utiles: Découvrez le premier commentaire de kvcrawford sur le référentiel du module dans this page Passport-google est un autre module populaire utilisé pour fournir une connexion à l'aide de Google. , son genre de dépassé maintenant, voici le link en ce qui concerne ses récents numéros]
Dans la plupart des exemples sur le Web, le code de routage se fait comme suit:
app.get('/auth/google', passport.authenticate('google'));
Selon le Express Reference , les rappels de la méthode app.get
reçoivent trois arguments, request
, response
et 'next'. Cela signifie que, dans l'exemple ci-dessus, la méthode authenticate retourne un objet fonction et qu'elle est exécutée avec trois arguments: request
, response
et 'next'.
Donc, si vous voulez faire une authentification dans la fonction de rappel de la méthode app.get
comme ceci:
app.get('/auth/google', function() {
passport.authenticate('google', {scope: ['profile', 'email']});
});
alors vous devriez écrire:
app.get('/auth/google', function(request, response, next) {
passport.authenticate('google', {scope: ['profile', 'email']})(request, response, next);
});
Je suis d'accord avec vous @Seiya mais j'ajouterais une redirection
app.get(
"/auth/google/callback",
passport.authenticate('google'),
(req, res) => {
res.redirect('/whatever')
}
);