Coder Social home page Coder Social logo

Comments (8)

madhums avatar madhums commented on August 22, 2024

I am trying to fix it, looks like some kind of parsing issue...

Error: key $t must not start with '$'
    at Error (unknown source)
    at Function.checkKey (/Users/madhu/code/nodejs-express-mongoose-demo/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/bson.js:1395:11)
    at serializeObject (/Users/madhu/code/nodejs-express-mongoose-demo/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/bson.js:350:14)
    at packElement (/Users/madhu/code/nodejs-express-mongoose-demo/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/bson.js:840:23)
    at serializeObject (/Users/madhu/code/nodejs-express-mongoose-demo/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/bson.js:354:15)
    at packElement (/Users/madhu/code/nodejs-express-mongoose-demo/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/bson.js:840:23)
    at serializeObject (/Users/madhu/code/nodejs-express-mongoose-demo/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/bson.js:354:15)
    at packElement (/Users/madhu/code/nodejs-express-mongoose-demo/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/bson.js:840:23)
    at serializeObject (/Users/madhu/code/nodejs-express-mongoose-demo/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/bson.js:354:15)
    at Function.serializeWithBufferAndIndex (/Users/madhu/code/nodejs-express-mongoose-demo/node_modules/mongoose/node_modules/mongodb/node_modules/bson/lib/bson/bson.js:327:10)

from node-express-mongoose-demo.

teddychan avatar teddychan commented on August 22, 2024

the problem is the google json key has some key name start with "$" and monogo db don't support.

I have work around:

// use google strategy
  passport.use(new GoogleStrategy({
      consumerKey: config.google.clientID,
      consumerSecret: config.google.clientSecret,
      callbackURL: config.google.callbackURL
    },
    function(accessToken, refreshToken, profile, done) {
      User.findOne({ 'google.id': profile.id }, function (err, user) {
        if (!user) {
          // make a new google profile without key start with $
          var new_profile = {}
          new_profile.id = profile.id
          new_profile.displayName = profile.displayName
          new_profile.emails = profile.emails
          user = new User({
              name: profile.displayName
            , email: profile.emails[0].value
            , username: 'google'
            , provider: profile.username
            , google: new_profile._json
          })
          user.save(function (err) {
            if (err) console.log(err)
            return done(err, user)
          })
        } else {
          return done(err, user)
        }
      })
    }
  ));

from node-express-mongoose-demo.

salimkayabasi avatar salimkayabasi commented on August 22, 2024

My GoogleStrategy code is here,

passport.use(new GoogleStrategy({
            clientID:config.google.clientID,
            clientSecret:config.google.clientSecret,
            callbackURL:config.google.callbackURL,
            passReqToCallback:true
        },
        function (req, accessToken, refreshToken, profile, done) {
            process.nextTick(function () {
                User.findOne({ 'google.id':profile.id }, function (err, user) {
                    if (err) {
                        return done(err)
                    }
                    if (req.user !== undefined || user) {
                        if (req.user !== undefined)
                            user = req.user;
                        user = UserControl.extractProfile(user, profile, accessToken, refreshToken)
                    } else {
                        user = UserControl.extractProfile(new User(), profile, accessToken, refreshToken)
                    }
                    user.save(function (err, user) {
                        if (err) console.log(err)
                        return done(err, user)
                    })
                });
            });
        }
    ));

and UserControl.extractProfile is only get some extra data with using tokens

from node-express-mongoose-demo.

pcanterini avatar pcanterini commented on August 22, 2024

teddychan's workaround fixed it but needed a small edit:

, username: profile.username
, provider: 'google'

from node-express-mongoose-demo.

Chaosbohne avatar Chaosbohne commented on August 22, 2024

Another solution ist using OAuth2Strategy

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

Than you have to change:

consumerKey: GOOGLE_CLIENT_ID,
consumerSecret: GOOGLE_CLIENT_SECRET,
callbackURL: "http://127.0.0.1:3000/auth/google/callback"

to:

clientID: GOOGLE_CLIENT_ID,
clientSecret: GOOGLE_CLIENT_SECRET,
callbackURL: "http://127.0.0.1:3000/auth/google/callback"

and it should work like a charm ;)

Edit:
Route should be something like this:

app.get('/auth/google', passport.authenticate('google', { scope: ['https://www.googleapis.com/auth/userinfo.profile', 'https://www.googleapis.com/auth/userinfo.email'] }));
app.get('/auth/google/callback', passport.authenticate('google', { failureRedirect: '/login', successRedirect: '/' }));   

from node-express-mongoose-demo.

talamaska avatar talamaska commented on August 22, 2024

I was wandering how to switch to oauth2, I was commenting a line in the module index.js, this is prettier way. Thanks

from node-express-mongoose-demo.

dpkirchner avatar dpkirchner commented on August 22, 2024

In addition, you need to update config/passport.js's "passport.use(new GoogleStrategy" block to define clientID and clientSecret (replacing consumerKey and consumerSecret).

from node-express-mongoose-demo.

amirmog avatar amirmog commented on August 22, 2024

Thanks everyone for their solutions.

Both solutions work however, the Oauth2 maybe a better way to go since google recommends it.

Here is the OAuth2Strategy again exactly as it was mentioned above, but all in one place:

change the passport.use(new GoogleStrategy({ block in passport.js to:

// use google strategy
  passport.use(new GoogleStrategy({
      clientID: config.google.clientID,
      clientSecret: config.google.clientSecret,
      callbackURL: config.google.callbackURL
    },
    function(accessToken, refreshToken, profile, done) {
      User.findOne({ 'google.id': profile.id }, function (err, user) {
        if (!user) {
          // make a new google profile without key start with $
          var new_profile = {}
          new_profile.id = profile.id
          new_profile.displayName = profile.displayName
          new_profile.emails = profile.emails
          user = new User({
              name: profile.displayName
            , email: profile.emails[0].value
            , username: profile.username
            , provider: 'google'
            , google: new_profile._json
          })
          user.save(function (err) {
            if (err) console.log(err)
            return done(err, user)
          })
        } else {
          return done(err, user)
        }
      })
    }
  ));

change the routes for google in routes.js to:

  app.get('/auth/google', passport.authenticate('google', { scope: ['https://www.googleapis.com/auth/userinfo.profile', 'https://www.googleapis.com/auth/userinfo.email'] }))
  app.get('/auth/google/callback', passport.authenticate('google', { failureRedirect: '/login', successRedirect: '/' }))

from node-express-mongoose-demo.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.