首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >passport-facebook -无法获取about_me和电子邮件配置文件字段

passport-facebook -无法获取about_me和电子邮件配置文件字段
EN

Stack Overflow用户
提问于 2013-11-30 02:08:46
回答 1查看 13.3K关注 0票数 18

我正在尝试使用passport-facebook为我的应用程序建立一个登录系统。除了从请求中返回的两个未定义的字段之外,一切都很顺利。

我将发布我的整个登录过程的代码,因为我在这里没有看到很多关于它的信息,尽管在这个问题上有很多问题。

这是app.js中的配置

代码语言:javascript
复制
var passport = require('passport');
var FacebookStrategy = require('passport-facebook').Strategy;

passport.serializeUser(function(user, done) {
  done(null, user.facebookId);
});
passport.deserializeUser(function(id, done) {
  routes.findUserById(id, function(err, user) {
    done(err, user);
  });
});

passport.use(new FacebookStrategy({
    clientID: FACEBOOK_APP_ID,
    clientSecret: FACEBOOK_APP_SECRET,
    callbackURL: FACEBOOK_CALLBACK_URL,
    profileFields: ['id', 'displayName', 'link', 'about_me', 'photos', 'email']
  },
  routes.handleLogin
));

使用passport初始化和会话

代码语言:javascript
复制
app.use(passport.initialize());
app.use(passport.session());

实际的请求处理,请注意我使用的作用域是正确的

代码语言:javascript
复制
app.get('/auth/facebook', passport.authenticate('facebook', { scope: ['user_about_me', 'email'] }));
app.get('/auth/facebook/callback', passport.authenticate('facebook', { successRedirect: '/', failureRedirect: '/error' }));

这是我在路由器中的用户创建功能

代码语言:javascript
复制
exports.handleLogin = function(accessToken, refreshToken, profile, done) {
  db.userCatalog.findOne({ facebookId: profile.id }, function(err, existingUser) {
    if (err) {
      return done(err);
    }
    else {
      if(existingUser) {
        console.log('User: ' + existingUser.name + ' found and logged in!');
        done(null, existingUser);
        } 
      else {
        new db.userCatalog({
        name: profile.displayName,
        facebookId: profile.id,
        link: profile.link,
        picture: profile.photos[0].value,
        bio: profile.about_me,
        email: profile.email
        }).save(function (err, data) {
          if (err) {
            return done(err);
          }
          else {
            console.log('New user: ' + data + ' created and logged in!');
            done(null, data);
          }
        });
      }
    }
  });
};

以及登录完成后新建用户时的结果:

我相信这是新手犯的错误,但我自己就是想不通。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-26 05:40:58

Facebook返回一些默认属性。如果您想访问有关客户端配置文件的更多详细信息,则必须在FacebookStrategy下声明它

代码语言:javascript
复制
passport.use(new FacebookStrategy({

        clientID: "...",
        clientSecret: "...",
        callbackURL: "...",
        profileFields: ['id', '...', '...', 'photos', 'emails']

      }, ...

因此,一旦你声明了你想要从Facebook接收的属性,当有人试图登录你的系统时,他会被要求与你/你的应用程序分享他的照片或电子邮件。一旦他批准了它,你就可以访问它的值:

代码语言:javascript
复制
profile.photos[0].value,
profile.emails[0].value,
...

对于电子邮件,有时更改以下内容很有用:

代码语言:javascript
复制
passport.authenticate('facebook');

要这样做:

代码语言:javascript
复制
passport.authenticate('facebook', { scope: 'email'}));
票数 39
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20291357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档