User.findOrCreate
是一个虚构的函数,代表你用于通过 Facebook ID 查找用户或在用户不存在时创建用户的任何函数。我认为你的第一个问题是你的回调 URL 只是指向了你的根目录,所以你可能永远无法到达那个函数。
你的回调 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 的 passport 代码,并添加了一些注释以进行解释。这假设您正在使用类似 MongoDB 的东西并且有一个 User
表 (在此情况下,User
就是您声明的任何可以与 User
表接口的变量)。
passport.use(new FacebookStrategy({
clientID: config.facebook.clientID,
clientSecret: config.facebook.clientSecret,
callbackURL: config.facebook.callbackURL
},
function(accessToken, refreshToken, profile, done) {
User.findOne({
'facebook.id': profile.id
}, function(err, user) {
if (err) {
return done(err);
}
if (!user) {
user = new User({
name: profile.displayName,
email: profile.emails[0].value,
username: profile.username,
provider: 'facebook',
facebook: profile._json
});
user.save(function(err) {
if (err) console.log(err);
return done(err, user);
});
} else {
return done(err, user);
}
});
}
));
就我个人而言,我也使用“会员”表来跟踪每个用户的多个帐户(以便他们可以使用多个帐户进行身份验证),因为我是通过mongoose设置它的。实际上,这就是我存储访问令牌的地方。我更喜欢这种方法,而不是在用户表中添加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) {
其中成员身份是上述模型,并被定义为变量,如下:
var Membership = require('./models/membership.js')
function(accessToken...)
中尝试返回return done(null, profile);
,因为它需要返回一些东西,否则就像你说的那样,它似乎永远不会终止。 - MikeSmithDevif (!user) {
部分中包含它。 - MikeSmithDev