0

我已向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);
                        });
                    }
                });

        });

        }));

    };

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

4

2 回答 2

3

请检查链接

@rvetere 发表评论。

您从个人资料中收到一封电子邮件:

profile.emails[0].value

另外,检查您的userProfileURL

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,
},
于 2018-01-25T13:32:37.260 回答
1

在护照推特中,您可以实现此代码

passport.use(
 new TwitterStrategy (
  ...keys,
  includeEmail: true,
 )
)

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

于 2021-07-25T03:26:34.843 回答