Comments (8)
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.
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.
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.
teddychan's workaround fixed it but needed a small edit:
, username: profile.username
, provider: 'google'
from node-express-mongoose-demo.
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.
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.
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.
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)
- An in-range update of babel-eslint is breaking the build 🚨 HOT 3
- Cannot read property 'on' of undefined HOT 2
- An in-range update of multer is breaking the build 🚨 HOT 1
- [nodemon] app crashed - waiting for file changes before starting... HOT 2
- An in-range update of compression is breaking the build 🚨 HOT 1
- An in-range update of supertest is breaking the build 🚨 HOT 5
- An in-range update of morgan is breaking the build 🚨 HOT 1
- User validation failed: email: fn is not a function HOT 2
- An in-range update of cors is breaking the build 🚨 HOT 1
- An in-range update of connect-mongo is breaking the build 🚨 HOT 2
- TypeError: Cannot read property 'on' of undefined in server.js file HOT 2
- An in-range update of cookie-parser is breaking the build 🚨 HOT 1
- Remove $ from bash codeblocks
- Catch block only checks 422 validation error HOT 1
- (node:54610) UnhandledPromiseRejectionWarning: MongoError: not authorized HOT 2
- docker security flaw
- Error running the project on local HOT 2
- req.user problem HOT 3
- Responsible disclosure policy HOT 2
- how to remove cannot get error HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from node-express-mongoose-demo.