如何使用 passport-google-oauth20 获取用户电子邮件

How can I get user email with passport-google-oauth20

我正在尝试使用 Node.js、passport 和 passport-google-oauth20 实现用户身份验证。所有 register/login 处理工作正常,除了它无法检索用户电子邮件(所有其他数据,如 'displayName' 或 'provider' 已成功保存到我的数据库中,但不是 'email')。

谁能帮助我使用 passport-google-oauth20 获取用户电子邮件?

我的代码:

const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const passport = require('passport');
const passportLocalMongoose = require('passport-local-mongoose');
const session = require('express-session');
const findOrCreate = require('mongoose-findorcreate');
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const FacebookStrategy = require('passport-facebook').Strategy;
const app = express();

app.use(express.static('public'));
app.use(session({
    secret: process.env.SESSION_SECRET,
    resave: false,
    saveUninitialized: false
}));
app.use(bodyParser.urlencoded({ extended: true }));
app.use(passport.initialize());
app.use(passport.session());

mongoose.connect('mongodb://localhost:27017/yourDB', {
    useNewUrlParser: true,
    useUnifiedTopology: true
});
mongoose.set('useFindAndModify', false);

const userSchema = new mongoose.Schema({
    username: String,
    email: String,
    password: String,
    displayName: String,
    provider: String
});

userSchema.plugin(passportLocalMongoose);
userSchema.plugin(findOrCreate);

const User = mongoose.model('User', userSchema);

passport.use(new GoogleStrategy({
    clientID: process.env.GOOGLE_CLIENT_ID,
    clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    callbackURL: 'http://localhost:3000/auth/google/cb',
    userProfileURL: 'https://www.googleapis.com/oauth2/v3/userinfo'
},
    function (accessToken, refreshToken, profile, cb) {
        User.findOrCreate(
    { googleId: profile.id }, 
    { displayName: profile.displayName, email: profile.email, provider: 'google' }, 
    function (error, user) {
            return cb(error, user);
        });
    }
));

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

app.get('/auth/google/journal',
    passport.authenticate('google', { failureRedirect: '/register' }),
    function (req, res) {
        res.redirect('/compose');
    }
);

您需要查找 'emails' 数组而不是电子邮件。请参考以下截图