当前位置: 首页 > 面试题库 >

User.findOrCreate函数的作用是什么?何时在护照中调用它?

单于承
2023-03-14
问题内容

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

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? 
       });

  }
));

如何从护照获得访问令牌?


问题答案:

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 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);
            }
        });
    }
));

我个人也使用“会员”表来跟踪每个用户的多个帐户(以便他们可以通过多个帐户进行身份验证),因为我是通过猫鼬设置的。实际上,这是我存储该访问令牌的位置。我更喜欢在用户表中有一个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')


 类似资料:
  • 问题内容: 在passportJS Documention中,我认为护照认证功能记录得不好。 我想问一下,passport.isAuthenticated()id是做什么的? 问题答案: 对于任何请求,您都可以使用此方法检查用户是否已通过身份验证。

  • 问题内容: 从文档中学习React 并遇到以下示例: 根据Mozilla的说法,super允许您在构造函数中使用。是否有其他原因可以单独使用(我知道也可以访问父类的方法),但是使用React时,是否还有其他仅通过自身调用的用例? 问题答案: 仅在具有构造函数的React组件内部被调用。例如,以下代码不需要超级: 但是,如果我们有一个构造函数,那么它是强制性的: 之所以不能被允许之前的原因是因为未调

  • 问题内容: 我阅读了Python 2文档并注意到该功能: 返回对象的“身份”。这是一个整数(或长整数),在该对象的生存期内,此整数保证是唯一且恒定的。具有不重叠生存期的两个对象可能具有相同的值。 CPython实现细节:这是对象在内存中的地址。 因此,我通过使用列表进行了实验: 函数返回的整数是多少?它与中的内存地址同义吗?如果是这样,为什么整数不对应于数据类型的大小? 在实践中何时使用 问题答案

  • 本文向大家介绍什么是JavaScript中的自调用匿名函数?,包括了什么是JavaScript中的自调用匿名函数?的使用技巧和注意事项,需要的朋友参考一下 在JavaScript中,用括号括起来的函数称为“立即调用函数表达式”或“自执行函数”。 包装的目的是为了命名空间并控制成员函数的可见性。它将代码包装在函数范围内,并减少了与其他库的冲突。这就是我们所说的立即调用函数表达式(IIFE)或自执行匿

  • 本文向大家介绍函数的调用栈是怎么工作的?相关面试题,主要包含被问及函数的调用栈是怎么工作的?时的应答技巧和注意事项,需要的朋友参考一下 1.首次运行JS代码时,会创建一个全局执行上下文,push到当前的执行栈中,每当发生函数调用,都会为该函数创建一个函数执行上下文并push到当前执行栈的栈顶 2.当栈顶的函数执行完以后,其对应的函数执行上下文将会从执行栈中pop出去,执行上下文的控制权将移动到当前

  • 本文向大家介绍是否使用过functools中的函数?其作用是什么?相关面试题,主要包含被问及是否使用过functools中的函数?其作用是什么?时的应答技巧和注意事项,需要的朋友参考一下 用于修复装饰器