Node.js Passport: Twitter не возвращает электронную почту пользователя во время аутентификации.
Я запросил разрешение у https://apps.twitter.com/, и процесс аутентификации работает успешно, но Twitter не возвращает электронную почту пользователя. Все остальные детали были возвращены (id, токен, имя пользователя, displayName), но Email остается нулевым.
Я опубликую часть моего кода ниже для контекста:
Это моя схема базы данных mongoose:
var mongoose = require('mongoose');
//Defining the database scheme.
var userSchema = mongoose.Schema ({
twitter: {
id: Number,
token: String,
email: {type:String, unique:true},
username: String,
displayName: String,
signupDate: { type: Date, default: Date.now }
}
});
//make the model available public
module.exports = mongoose.model('User', userSchema);
Мой passport.js:
//passport.js
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var TwitterStrategy = require('passport-twitter').Strategy;
// load up the user model
var User = require('../app/models/user');
// load the auth variables
var configAuth = require('./auth');
module.exports = function(passport) {
// used to serialize the user for the session
passport.serializeUser(function(user, done) {
done(null, user.id);
});
// used to deserialize the user
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
// code for login (use('local-login', new LocalStategy))
// code for signup (use('local-signup', new LocalStategy))
// code for facebook (use('facebook', new FacebookStrategy))
// =========================================================================
// TWITTER =================================================================
// =========================================================================
passport.use(new TwitterStrategy({
consumerKey : configAuth.twitterAuth.consumerKey,
consumerSecret : configAuth.twitterAuth.consumerSecret,
callbackURL : configAuth.twitterAuth.callbackURL,
userProfileURL: "https://api.twitter.com/1.1/account/verify_credentials.json?include_email=true",
passReqToCallback : true,
},
function(token, tokenSecret, profile, done) {
// make the code asynchronous
// User.findOne won't fire until we have all our data back from Twitter
process.nextTick(function() {
User.findOne({ 'twitter.id' : profile.id }, function(err, user) {
// if there is an error, stop everything and return that
// ie an error connecting to the database
if (err)
return done(err);
// if the user is found then log them in
if (user) {
return done(null, user); // user found, return that user
} else {
// if there is no user, create them
var newUser = new User();
// set all of the user data that we need
newUser.twitter.id = profile.id;
newUser.twitter.token = token;
newUser.twitter.username = profile.username;
newUser.twitter.displayName = profile.displayName;
newUser.twitter.email = profile.email;
// save our user into the database
newUser.save(function(err) {
if (err)
throw err;
return done(null, newUser);
});
}
});
});
}));
};
Я хотел бы знать, что я делаю неправильно, чтобы я мог успешно вернуть электронную почту пользователя. Спасибо
2 ответа
Пожалуйста, проверьте ссылку
комментарий @rvetere.
Вы получаете письмо из профиля:
profile.emails[0].value
Также проверь своего пользователя ProfileURL
export default new TwitterStrategy({
consumerKey : process.env.AUTH_TWITTER_CONSUMER_KEY,
consumerSecret : process.env.AUTH_TWITTER_CONSUMER_SECRET,
callbackURL : process.env.AUTH_TWITTER_CALLBACK_URL,
userProfileURL : 'https://api.twitter.com/1.1/account/verify_credentials.json?include_email=true',
passReqToCallback : true,
},
в паспорте-твиттере вы можете реализовать этот код
passport.use(
new TwitterStrategy (
...keys,
includeEmail: true,
)
)
вам следует настроить параметры приложения в своем твиттере разработчика, чтобы проверить разрешение для электронной почты учетной записи.