Google oauth 不返回电子邮件护照身份验证
Posted
技术标签:
【中文标题】Google oauth 不返回电子邮件护照身份验证【英文标题】:Google oauth not returning email passport authentication 【发布时间】:2016-11-10 14:54:59 【问题描述】:我正在尝试使用节点 js 的护照模块使用谷歌按钮登录。我正在尝试获取人的电子邮件 ID、姓名、个人资料图片。我正在尝试将图片下载到本地服务器。即使在将“电子邮件”添加到范围后,Google 也没有返回电子邮件 ID,而且返回的个人资料图片链接也不起作用。我已经研究了这个问题的各种答案,但都说要包括 userinfo.email。它现在已被弃用。根据谷歌文档,新的范围参数是电子邮件。
下面是我的代码。任何帮助表示赞赏。
护照
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 : '/'
));
下载.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!");
);
【问题讨论】:
【参考方案1】:在callbackUrl后面添加这行代码
userProfileURL: "https://www.googleapis.com/oauth2/v3/userinfo"
【讨论】:
【参考方案2】:根据 oauth 的 google 文档,第一个参数必须是 openid,第二个参数可以是电子邮件或个人资料,或两者兼而有之
app.get('/auth/google',
passport.authenticate('google', scope: ['openid', 'email', 'profile'])
);
documentation
【讨论】:
【参考方案3】:上面的答案肯定有效,还有另一种方法可以解决这个问题。
app.get('/auth/google',
passport.authenticate('google', scope: ['profile', 'email'] )
);
在您的routes.js
和profile
中添加email
。
这应该可以解决您的问题。
【讨论】:
【参考方案4】:我遇到了同样的问题,就这样写了范围:
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);
);
希望对你有帮助。
【讨论】:
谢谢。我开始工作了 :) 你能在 fb oauth 中帮我吗?我已经让它工作了,但出现了标记化错误。这是链接***.com/questions/38299165/… 每次 api 尝试访问用户配置文件时,您是否获得授权屏幕? 事实是我从这个开始。我必须做更多的测试,但现在没有这个问题。用 Facebook 登录我还没有实现。当我做这件事时,如果可以的话,我会尽力帮助你解决你的问题。 你能告诉我你每次尝试登录时都会出现身份验证屏幕吗 并非如此。看这篇文章link,我想你的问题可能是刷新令牌。以上是关于Google oauth 不返回电子邮件护照身份验证的主要内容,如果未能解决你的问题,请参考以下文章
使用电子邮件进行身份验证时,NestJS 护照身份验证返回 401
Laravel 护照 oauth 路线总是返回 401 未经授权
使用 Spring Boot OAuth2 针对 Google 进行身份验证时如何将 google 用户电子邮件发送到白名单用户