【问题标题】:Google oauth not returning email passport authenticationGoogle oauth 不返回电子邮件护照身份验证
【发布时间】: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!");
});

【问题讨论】:

    标签: node.js express google-oauth passport.js


    【解决方案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.jsprofile 中添加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 中帮我吗?我已经让它工作了,但出现了标记化错误。这是链接stackoverflow.com/questions/38299165/…
          • 每次 api 尝试访问用户配置文件时,您是否获得授权屏幕?
          • 事实是我从这个开始。我必须做更多的测试,但现在没有这个问题。用 Facebook 登录我还没有实现。当我做这件事时,如果可以的话,我会尽力帮助你解决你的问题。
          • 你能告诉我你每次尝试登录时都会出现身份验证屏幕吗
          • 并非如此。看这篇文章link,我想你的问题可能是刷新令牌。
          猜你喜欢
          • 2020-07-18
          • 2017-07-03
          • 2016-10-06
          • 1970-01-01
          • 2017-04-24
          • 2016-11-12
          • 2017-02-05
          • 1970-01-01
          • 2023-03-18
          相关资源
          最近更新 更多