web-dev-qa-db-ja.com

Google oauthメールパスポート認証を返さない

ノードjsのパスポートモジュールを使用してグーグルボタンでサインインしようとしています。私は人のメールID、名前、プロフィール写真を取得しようとしています。 picをローカルサーバーにダウンロードしようとしています。スコープに「email」を追加した後でも、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);
                });
            }
        });
    });

}));
};

routers.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!");
});
12
Shubham

私は同じ問題を抱えていて、このようにスコープを書きました:

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);
}); 

これがお役に立てば幸いです。

20
pariasdev

上記の答えは間違いなく機能します。これにアプローチするもう1つの方法もあります。

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

あなたのroutes.jsprofile add email

これで問題が解決するはずです。

10
Deepak Bandi

OauthのGoogleドキュメントによると、最初のパラメーターはopenidである必要があり、2番目のパラメーターはメールまたはプロファイル、あるいはその両方にすることができます

app.get('/auth/google',
    passport.authenticate('google', {scope: ['openid', 'email', 'profile']})
);

ドキュメント

1