Shubham Singla Shubham Singla - 4 months ago 25
Node.js Question

Google oauth not returning email passport authentication

I am trying to make a sign in with google button using passport module of node js. i am trying to get persons email id, name , profile pic. I am trying to download pic to local server. Google is not returning email id even after adding 'email' to scope and nor the returned link for profile pic is working. I have looked into various answers to this question but all says to include userinfo.email .it has been deprecated now. As per google documentation new scope parameter is email
below is my code
Any help is appreciated
Passport

passport.use(new GoogleStrategy({

clientID : configAuth.googleAuth.clientID,
clientSecret : configAuth.googleAuth.clientSecret,
callbackURL : configAuth.googleAuth.callbackURL,
},
function(token, refreshToken, profile, done) {

// make the code asynchronous
// User.findOne won't fire until we have all our data back from Google
process.nextTick(function() {

// try to find the user based on their google id
User.findOne({ 'google.id' : profile.id }, function(err, user) {
if (err)
return done(err);

if (user) {

// if a user is found, log them in
return done(null, user);
} else {
// if the user isnt in our database, create a new user
var newUser = new User();
console.log(profile);
//JSON.parse(profile);
// set all of the relevant information
newUser.google.id = profile.id;
newUser.google.token = profile.token;
newUser.google.name = profile.displayName;
newUser.google.uname = profile.emails[0].value; // pull the first email
newUser.google.dp = profile._json.picture;
console.log('url is');
console.log(newUser.google.name);
console.log(newUser.google.dp);
//console.log(profile.picture);
Download(newUser.google.uname, newUser.google.dp,function(err){
if(err)
console.log('error in dp');
else
console.log('Profile Picture downloaded');
});

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

}));
};


routes.js

app.get('/connect/google', passport.authorize('google', { scope : ['profile', 'email'] }));

// the callback after google has authorized the user
app.get('/connect/google/callback',
passport.authorize('google', {
successRedirect : '/profile',
failureRedirect : '/'
}));


download.js

module.exports = function(username, uri, callback){
var destination;

request(uri).pipe(fs.createWriteStream("./downloads/"+username+".png"))
.on('close', function(){
console.log("saving process is done!");
});

Answer

I had the same problem and wrote the scope in this way:

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

And you will get the email:

function(accessToken, refreshToken, profile, done) {
    console.log(profile.emails[0].value);
}); 

I hope this helps you.