Andrew
Andrew

Reputation: 3591

passport.js throws Unknown authentication strategy "Google"

I've been following this guide and I keep getting the error "unknown authentication strategy 'google'". I've no idea what's going on and I already tried searching the other answers with little success. Any help would be appreciated, thanks!

Error:

Unknown authentication strategy "google"
Error: Unknown authentication strategy "google"
  at attempt (D:\Programming\weebly-site\node_modules\passport\lib\middleware\authenticate.js:166:37)
  at authenticate (D:\Programming\weebly-site\node_modules\passport\lib\middleware\authenticate.js:342:7)
  at Layer.handle [as handle_request] (D:\Programming\weebly-site\node_modules\express\lib\router\layer.js:76:5)
  at next (D:\Programming\weebly-site\node_modules\express\lib\router\route.js:100:13)
  at Route.dispatch (D:\Programming\weebly-site\node_modules\express\lib\router\route.js:81:3)
  at Layer.handle [as handle_request] (D:\Programming\weebly-site\node_modules\express\lib\router\layer.js:76:5)
  at D:\Programming\weebly-site\node_modules\express\lib\router\index.js:234:24
  at Function.proto.process_params (D:\Programming\weebly-site\node_modules\express\lib\router\index.js:312:12)
  at D:\Programming\weebly-site\node_modules\express\lib\router\index.js:228:12
  at Function.match_layer (D:\Programming\weebly-site\node_modules\express\lib\router\index.js:295:3)
  at next (D:\Programming\weebly-site\node_modules\express\lib\router\index.js:189:10)
  at D:\Programming\weebly-site\node_modules\express\lib\router\index.js:191:16
  at Function.match_layer (D:\Programming\weebly-site\node_modules\express\lib\router\index.js:295:3)
  at next (D:\Programming\weebly-site\node_modules\express\lib\router\index.js:189:10)
  at D:\Programming\weebly-site\node_modules\express\lib\router\index.js:191:16
  at Function.match_layer (D:\Programming\weebly-site\node_modules\express\lib\router\index.js:295:3)
  at next (D:\Programming\weebly-site\node_modules\express\lib\router\index.js:189:10)
  at Function.proto.handle (D:\Programming\weebly-site\node_modules\express\lib\router\index.js:165:3)
  at router (D:\Programming\weebly-site\node_modules\express\lib\router\index.js:34:12)
  at Layer.handle [as handle_request] (D:\Programming\weebly-site\node_modules\express\lib\router\layer.js:76:5)
  at trim_prefix (D:\Programming\weebly-site\node_modules\express\lib\router\index.js:270:13)
  at D:\Programming\weebly-site\node_modules\express\lib\router\index.js:237:9
  at Function.proto.process_params (D:\Programming\weebly-site\node_modules\express\lib\router\index.js:312:12)
  at D:\Programming\weebly-site\node_modules\express\lib\router\index.js:228:12
  at Function.match_layer (D:\Programming\weebly-site\node_modules\express\lib\router\index.js:295:3)
  at next (D:\Programming\weebly-site\node_modules\express\lib\router\index.js:189:10)
  at D:\Programming\weebly-site\node_modules\express\lib\router\index.js:560:15
  at next (D:\Programming\weebly-site\node_modules\express\lib\router\index.js:186:14)
  at D:\Programming\weebly-site\node_modules\express\lib\router\index.js:191:16
  at Function.match_layer (D:\Programming\weebly-site\node_modules\express\lib\router\index.js:295:3)
  at next (D:\Programming\weebly-site\node_modules\express\lib\router\index.js:189:10)
  at Function.proto.handle (D:\Programming\weebly-site\node_modules\express\lib\router\index.js:165:3)
  at router (D:\Programming\weebly-site\node_modules\express\lib\router\index.js:34:12)
  at Layer.handle [as handle_request] (D:\Programming\weebly-site\node_modules\express\lib\router\layer.js:76:5)
  at trim_prefix (D:\Programming\weebly-site\node_modules\express\lib\router\index.js:270:13)
  at D:\Programming\weebly-site\node_modules\express\lib\router\index.js:237:9
  at Function.proto.process_params (D:\Programming\weebly-site\node_modules\express\lib\router\index.js:312:12)
  at D:\Programming\weebly-site\node_modules\express\lib\router\index.js:228:12
  at Function.match_layer (D:\Programming\weebly-site\node_modules\express\lib\router\index.js:295:3)
  at next (D:\Programming\weebly-site\node_modules\express\lib\router\index.js:189:10)
  at SendStream.error (D:\Programming\weebly-site\node_modules\express\node_modules\serve-static\index.js:98:7)
  at SendStream.emit (events.js:95:17)
  at SendStream.error (D:\Programming\weebly-site\node_modules\express\node_modules\send\index.js:244:17)
  at SendStream.onStatError (D:\Programming\weebly-site\node_modules\express\node_modules\send\index.js:340:48)
  at next (D:\Programming\weebly-site\node_modules\express\node_modules\send\index.js:619:28)
  at D:\Programming\weebly-site\node_modules\express\node_modules\send\index.js:627:23
  at Object.oncomplete (fs.js:107:15)

admin.js

// Generated by CoffeeScript 1.8.0
(function() {
  var express, isLoggedIn, passport, router;

  express = require('express');

  passport = require('passport');

  router = express.Router();

  isLoggedIn = function(req, res, next) {
    if (req.isAuthenticated()) {
      return next();
    }
    res.redirect("/admin");
  };

  router.get('/', function(req, res) {
    return res.render('admin/admin_index.jade');
  });

  router.get('/editor', isLoggedIn, function(req, res) {
    return res.render('admin/admin_editor.jade');
  });

  router.get('/auth/google', passport.authenticate('google', {
    scope: ['profile', 'email']
  }));

  router.get('/auth/google/callback', passport.authenticate('google', {
    successRedirect: '/editor',
    failureRedirect: '/'
  }));

  module.exports = router;

}).call(this);

passport.js

var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;

var User = require('../models/users.js');

var configAuth = require('./auth.js');

module.exports = function(passport) {   
    passport.use(new GoogleStrategy({
        clientID        : configAuth.googleAuth.clientID,
        clientSecret    : configAuth.googleAuth.clientSecret,
        callbackURL     : configAuth.googleAuth.callbackURL,
    }, 
    passport.serializeUser(function(user, done){
        done(null, user.id);
    });

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

    function(token, refreshToken, profile, done) {
        process.nextTick(function() {
            User.findOne({ 'google.id' : profile.id}, function(err, user) {
                if(err)
                    return done(err);

                if(user) {
                    return done(null, user);
                } else {
                    var newUser         = new User();
                    newUser.google.id = profile.id;
                    newUser.google.token = token;
                    newUser.google.name = profile.displayName;
                    newUser.ggoogle.email = profile.emails[0].value;

                    newUser.save(function(err){
                        if(err)
                            throw err;
                        return done(null, newUser);
                    });
                }
            });
        });
    }));
};

Upvotes: 9

Views: 20457

Answers (3)

Aayush Shrestha
Aayush Shrestha

Reputation: 1

Including passport.initialize(); passport.session(); resolved the "Unknown authentication strategy 'Google'" error.

Upvotes: -1

Najim Ali
Najim Ali

Reputation: 201

Step 1- In the passport.js include the passport package & remove the module.exports & write the code as you were writing in the admin.js

Step 2 - in the admin.js include this line require('./passport.js'); after all the packages includes.

your passport.js will look like this -

var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;

    var User = require('../models/users.js');
    var configAuth = require('./auth.js');
    var passport = require('passport');
    
      
        passport.use(new GoogleStrategy({
            clientID        : configAuth.googleAuth.clientID,
            clientSecret    : configAuth.googleAuth.clientSecret,
            callbackURL     : configAuth.googleAuth.callbackURL,
        }, 
        passport.serializeUser(function(user, done){
            done(null, user.id);
        });
    
        passport.deserializeUser(function(id, done) {
            User.findById(id, function(err, user) {
                done(err, user);
            });
        });
    
        function(token, refreshToken, profile, done) {
            process.nextTick(function() {
                User.findOne({ 'google.id' : profile.id}, function(err, user) {
                    if(err)
                        return done(err);
    
                    if(user) {
                        return done(null, user);
                    } else {
                        var newUser         = new User();
                        newUser.google.id = profile.id;
                        newUser.google.token = token;
                        newUser.google.name = profile.displayName;
                        newUser.ggoogle.email = profile.emails[0].value;
    
                        newUser.save(function(err){
                            if(err)
                                throw err;
                            return done(null, newUser);
                        });
                    }
                });
            });
        }));
    

your admin.js will look this -

(function() {
  var express, isLoggedIn, passport, router;

  express = require('express');

  passport = require('passport');
 **// include the your passport.js file path
  require('./passport.js');**

  router = express.Router();

  isLoggedIn = function(req, res, next) {
    if (req.isAuthenticated()) {
      return next();
    }
    res.redirect("/admin");
  };

  router.get('/', function(req, res) {
    return res.render('admin/admin_index.jade');
  });

  router.get('/editor', isLoggedIn, function(req, res) {
    return res.render('admin/admin_editor.jade');
  });

  router.get('/auth/google', passport.authenticate('google', {
    scope: ['profile', 'email']
  }));

  router.get('/auth/google/callback', passport.authenticate('google', {
    successRedirect: '/editor',
    failureRedirect: '/'
  }));

  module.exports = router;

}).call(this);

Upvotes: 1

vesse
vesse

Reputation: 5078

It looks to me you are not calling require('./passport.js')(passport) (or whatever the path is) at all ie. you are not configuring passport. My assumption is maybe further backed up by the fact that if you would include that code from passport.js you would see SyntaxError: Unexpected token ; because, removing parameters and excess stuff, this is what you define:

passport.use(new GoogleStrategy({}, passport.serializeUser(function(user, done){});

passport.deserializeUser(function(id, done) { });

function(token, refreshToken, profile, done) { });

If you're gonna follow that tutorial you should have taken a look at the first part that defines the base application. In your admin.js, add require('./passport.js')(passport) after the line require('passport')

Upvotes: 11

Related Questions