Google oauth 不返回电子邮件护照身份验证
Google oauth not returning email passport authentication
我正在尝试使用节点 js 的护照模块通过 google 按钮登录。我正在尝试获取此人的电子邮件 ID、姓名、个人资料照片。我正在尝试将图片下载到本地服务器。即使在将 'email' 添加到范围后,Google 也不会返回电子邮件 ID,并且返回的个人资料图片的 link 也无法正常工作。我研究了这个问题的各种答案,但都说要包括 userinfo.email。它现在已被弃用。根据 google 文档,新范围参数是电子邮件。
下面是我的代码。感谢任何帮助。
护照
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!");
});
我遇到了同样的问题,作用域是这样写的:
app.get('/connect/google', passport.authenticate('google', {
scope: [
'https://www.googleapis.com/auth/userinfo.profile',
'https://www.googleapis.com/auth/userinfo.email'
]
}));
您将收到电子邮件:
function(accessToken, refreshToken, profile, done) {
console.log(profile.emails[0].value);
});
希望对您有所帮助。
以上答案绝对有效,还有另一种方法可以解决这个问题。
app.get('/auth/google',
passport.authenticate('google', { scope: ['profile', 'email'] })
);
在你的 routes.js
中加上 profile
添加 email
.
这应该可以解决您的问题。
根据 oauth 的 google 文档,第一个参数必须是 openid,第二个参数可以是电子邮件或个人资料,或两者都是
app.get('/auth/google',
passport.authenticate('google', {scope: ['openid', 'email', 'profile']})
);
在callbackUrl后面添加这行代码。
userProfileURL: "https://www.googleapis.com/oauth2/v3/userinfo"
我正在尝试使用节点 js 的护照模块通过 google 按钮登录。我正在尝试获取此人的电子邮件 ID、姓名、个人资料照片。我正在尝试将图片下载到本地服务器。即使在将 'email' 添加到范围后,Google 也不会返回电子邮件 ID,并且返回的个人资料图片的 link 也无法正常工作。我研究了这个问题的各种答案,但都说要包括 userinfo.email。它现在已被弃用。根据 google 文档,新范围参数是电子邮件。
下面是我的代码。感谢任何帮助。
护照
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!");
});
我遇到了同样的问题,作用域是这样写的:
app.get('/connect/google', passport.authenticate('google', {
scope: [
'https://www.googleapis.com/auth/userinfo.profile',
'https://www.googleapis.com/auth/userinfo.email'
]
}));
您将收到电子邮件:
function(accessToken, refreshToken, profile, done) {
console.log(profile.emails[0].value);
});
希望对您有所帮助。
以上答案绝对有效,还有另一种方法可以解决这个问题。
app.get('/auth/google',
passport.authenticate('google', { scope: ['profile', 'email'] })
);
在你的 routes.js
中加上 profile
添加 email
.
这应该可以解决您的问题。
根据 oauth 的 google 文档,第一个参数必须是 openid,第二个参数可以是电子邮件或个人资料,或两者都是
app.get('/auth/google',
passport.authenticate('google', {scope: ['openid', 'email', 'profile']})
);
在callbackUrl后面添加这行代码。
userProfileURL: "https://www.googleapis.com/oauth2/v3/userinfo"