User.findOrCreate是一种虚构函数,表示通过Facebook
ID查找用户或创建不存在的用户所需的任何功能。我认为您的第一个问题是回调URL只会进入您的根目录,因此您可能永远都无法使用该功能。
您的回调网址应为
http://localhost:3000/auth/facebook/callback。
然后处理该URL:
app.get('/auth/facebook/callback', passport.authenticate('facebook', { failureRedirect: '/login' }), function(req, res) { res.redirect('/'); });至此,身份验证完成。
accessToken返回给您-“应用程序每次调用API代表他们读取,修改或写入特定人的Facebook数据时,都需要这样做”。您应该将其保存在存储用户访问令牌的某些表中。
profile是另一个关键变量,因为这是有关用户的信息(哪些信息取决于服务)。
您在该功能内所做的一切取决于您
。因此,请自行制作
User.findOrCreate。这是Facebook护照上的代码,并附有一些解释说明。假设您正在使用MongoDB之类的东西并且有一个
User表。
User在这种情况下,您声明的任何变量都可以与
User表进行交互。
//Use facebook strategypassport.use(new FacebookStrategy({ clientID: config.facebook.clientID, clientSecret: config.facebook.clientSecret, callbackURL: config.facebook.callbackURL }, function(accessToken, refreshToken, profile, done) { //check user table for anyone with a facebook ID of profile.id User.findOne({ 'facebook.id': profile.id }, function(err, user) { if (err) { return done(err); } //No user was found... so create a new user with values from Facebook (all the profile. stuff) if (!user) { user = new User({ name: profile.displayName, email: profile.emails[0].value, username: profile.username, provider: 'facebook', //now in the future searching on User.findOne({'facebook.id': profile.id } will match because of this next line facebook: profile._json }); user.save(function(err) { if (err) console.log(err); return done(err, user); }); } else { //found user. Return return done(err, user); } }); }));我个人也使用“会员”表来跟踪每个用户的多个帐户(以便他们可以通过多个帐户进行身份验证),因为我是通过猫鼬设置的。实际上,这是我存储该访问令牌的位置。我更喜欢在用户表中有一个Facebook列…。但这取决于您。
var mongoose = require('mongoose'), Schema = mongoose.Schema, ObjectId = Schema.ObjectId;var membershipSchema = new Schema({ provider: String, providerUserId: String, accessToken: String, userId: {type: ObjectId, ref: 'User'}, dateAdded: {type: Date, default: Date.now}});module.exports = mongoose.model('Membership', membershipSchema);因此,我的版本
User.findOrCreate开始像这样:
function(accessToken, refreshToken, profile, done) { Membership.findOne({ providerUserId: profile.id }, function(err,membershipData) { //blah blah blah其中成员资格是上述模型,并且被定义为以下变量:
var Membership = require('./models/membership.js')


