节点.js护照:Twitter 在身份验证期间不返回用户的电子邮件。



我已经向 apps.twitter.com 请求了权限,身份验证过程正在成功,但Twitter没有返回用户的电子邮件。返回所有其他详细信息(id、令牌、用户名、显示名称(,但电子邮件仍为空。

我将在下面发布我的一些代码作为上下文:

这是我的猫鼬数据库架构:

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

我的护照.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);
                        });
                    }
                });
        });
        }));
    };

我很想知道我出了什么问题,这样我就可以成功返回用户的电子邮件。谢谢

请检查链接

@rvetere的评论。

您会收到来自个人资料的电子邮件:

profile.emails[0].value

另外,请检查您的用户个人资料网址

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,
 )
)

您应该在 Twitter 开发人员中配置应用设置,以检查帐户电子邮件的权限。

最新更新