web-dev-qa-db-fra.com

passeport google oauth sur localhost

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?

Mettre à jour :

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

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 

  1. allez ceci link et créez un projet, voici l'instantané du même enter image description here
  2. donnez un nouveau nom de projet et un nouvel identifiant, voici l'instantané enter image description here
  3. Cela va prendre environ une minute pour créer votre nouveau projet. Une fois votre projet créé, il vous redirigera vers la configuration de l'application de votre application. Dans la page redirigée, sélectionnez APIS AND AUTH -> API's , dans la page de l'API, activez l'API GOogle +, en voici un instantané. enter image description here
  4. 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é!enter image description here 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]

28
Karthic Rao

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

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')
    }
);
0
Djamal Dagirov