TypeError: обратный вызов не является функцией аутентификации Facebook на сервере остальных API - PullRequest
0 голосов
/ 06 февраля 2020

Я создаю спокойный сервер с аутентификацией на Facebook. Мой сервер ожидает токен доступа, предоставленный веб-клиентом или мобильным клиентом, с таким запросом:

  router.route('/auth/facebook').post(passport.authenticate('facebook-token',{
scope: ['publish_actions', 'manage_pages', 'user_about_me', 'user_photos', 'user_feed'] } ,{session: false}), function(req, res, next) {
if (!req.user) {
  return res.send(401, 'User Not Authenticated');
}
user = new User({});
  var token = jwt.sign(user.toObject(), config.secret);
  return res.json({success: true, token: 'JWT ' + token}); });

Конфигурация моего паспорта:

 passport.use(new FacebookTokenStrategy({
    clientID: 'MY CLIENT ID',
    clientSecret: 'MY CLIENT SECRET'
  },
  function (accessToken, refreshToken, profile, done) {
    User.upsertFbUser(accessToken, refreshToken, profile, function(err, user) {
      return done(err, user);
    });
  }));

Моя модель пользователя:

UserSchema.statics.upsertFbUser = function(accessToken, refreshToken, profile, cb) {
    var that = this;
    return this.findOne({
          'facebookProvider.id': profile.id
    }, function(err, user) {
      // no user was found, lets create a new one
      if (!user) {
            var newUser = new that({
                  username: profile.emails[0].value,
                  facebook: {
                        id: profile.id,
                        token: accessToken
                  }
            });

            newUser.save(function(error, savedUser) {
              if (error) {
                    console.log(error);
              }
              return cb(error, savedUser);
        });
      } else {
            return cb(err, user);
      }
    });
};

схема:

var UserSchema = new Schema({
    name: String,
    username: { type: String, unique: true },
    roles: [{ type: 'String' }],
    isVerified: { type: Boolean, default: false },
    password: String,
    passwordResetToken: String,
    passwordResetExpires: Date,
    facebook: {
        id: String,
        token: String,
        email: String,
        name: String,
        widgets: { type: Array, required: false},
        select: false,
        token: String,
    },
    google           : {
        id           : String,
        token        : String,
        email        : String,
        name         : String
    },
    spotify : false
});

И я получил эту ошибку при тестировании с почтальоном с токеном accces, предоставленным в заголовке:

TypeError: обратный вызов не является функцией на FacebookTokenStrategy.strategy.success (/Users/***/Epitech/AppDev/DEV_area_2019/server_api/node-rest-auth/node_modules/passport/lib/middleware/authenticate.js:219:18) проверено (/ Пользователи / ***** / Epitech / AppDev / DEV_area_2019 / server_api / node-rest-auth / node_modules / passport-facebook-token / lib / index. js: 102: 25) в / Users / **** /Epitech/AppDev/DEV_area_2019/server_api/node-rest-auth/config/passport.js:34:14

РЕДАКТИРОВАТЬ:


Это работает, когда я удалите авторизацию Scope:

scope: ['publish_actions', 'manage_pages', 'user_about_me', 'user_photos', 'user_feed']

Есть ли у вас идеи, почему он это делает? Должен ли веб-клиент поставить эту авторизацию на свою сторону? ***

Спасибо:)

...