如何使用 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' 数组而不是电子邮件。请参考以下截图
我正在尝试使用 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' 数组而不是电子邮件。请参考以下截图