gpt4 book ai didi

node.js - User.findOrCreate 函数是做什么的,什么时候在 Passport 中调用它?

转载 作者:IT老高 更新时间:2023-10-28 21:55:04 31 4
gpt4 key购买 nike

我找不到有关此功能的文档,因此无法使其正常工作。什么时候调用该函数,它在做什么以及将什么作为第一个参数?我正在尝试从 Passport 中获取访问 token ,但无论如何都无法访问它。

passport.use(new FacebookStrategy({
clientID: APP_ID,
clientSecret: APP_SECRET,
callbackURL: "http://localhost:3000/",
},
function(accessToken, refreshToken, profile, done) {
User.findOrCreate({// what are these parameters?}, function (err, user) {
// when is this function called and what is it doing?
});

}
));

如何从 Passport 中获取访问 token ?

最佳答案

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 数据时,都需要这样做”。您应该将其保存在为用户存储访问 token 的某个表中。 profile 是另一个关键变量,因为这是关于用户的信息(哪些信息取决于服务)。

您在该函数中执行的操作取决于您。所以,制作你自己的 User.findOrCreate。这是 Facebook Passport 中的代码,并附有一些注释来解释它。这假设您使用的是 MongoDB 之类的东西并且有一个 User 表。在这种情况下,User 是您声明的可以与 User 表交互的任何变量。

//Use facebook strategy
passport.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);
}
});
}
));

就我个人而言,我还使用“成员(member)”表来跟踪每个用户的多个帐户(这样他们就可以使用多个帐户进行身份验证),因为我是通过 mongoose 设置的。这实际上是我存储访问 token 的地方。我更喜欢在用户表中有一个 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')

关于node.js - User.findOrCreate 函数是做什么的,什么时候在 Passport 中调用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20431049/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com