webentwicklung-frage-antwort-db.com.de

Was macht die Funktion User.findOrCreate und wann wird sie im Pass aufgerufen?

Ich kann keine Dokumentation zu dieser Funktion finden und daher kann ich nicht dafür sorgen, dass sie richtig funktioniert. Wann wird diese Funktion aufgerufen, was macht sie und was nimmt sie als erste Parameter? Ich versuche, ein Zugriffstoken aus dem Reisepass zu erhalten, kann es aber trotzdem nicht erreichen.

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

  }
));

Wie bekomme ich ein Zugriffstoken aus dem Reisepass?

42
Tommz

User.findOrCreate ist eine erfundene Funktion, die jede Funktion darstellt, die Sie benötigen, um einen Benutzer anhand der Facebook-ID zu finden oder um eine zu erstellen, wenn der Benutzer nicht existiert. Ich denke, Ihr erstes Problem besteht darin, dass Ihre Rückruf-URL nur zu Ihrem Stammverzeichnis führt, sodass Sie wahrscheinlich nie zu dieser Funktion gelangen.

Ihre Rückruf-URL sollte wie folgt lauten: http://localhost:3000/auth/facebook/callback.

Und dann verarbeite diese URL:

app.get('/auth/facebook/callback', 
  passport.authenticate('facebook', { failureRedirect: '/login' }),
  function(req, res) {
    res.redirect('/');
  });

Zu diesem Zeitpunkt ist die Authentifizierung abgeschlossen. accessToken wird an Sie zurückgesandt - "Dies ist immer dann erforderlich, wenn die App eine API aufruft, um die Facebook-Daten einer bestimmten Person in deren Namen zu lesen, zu ändern oder zu schreiben." Sie sollten dies in einer Tabelle speichern, in der Sie Zugriffstoken für einen Benutzer speichern. profile ist die andere Schlüsselvariable, da dies die Informationen über den Benutzer sind (welche Informationen vom Dienst abhängen).

Was Sie in dieser Funktion tun, liegt bei Ihnen. Also, mach dein eigenes User.findOrCreate. Hier ist der Code aus dem Pass für Facebook mit einigen Kommentaren, um es zu erklären. Dies setzt voraus, dass Sie so etwas wie MongoDB verwenden und eine User -Tabelle haben. User ist in diesem Fall die Variable, die Sie als Schnittstelle zur Tabelle User deklariert haben.

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

Persönlich verwende ich auch eine "Mitgliedschaft" -Tabelle, um mehrere Konten pro Benutzer zu verfolgen (damit sie sich bei mehreren Konten authentifizieren können), während ich sie über Mungo einrichte. Hier speichere ich das Zugriffstoken. Ich bevorzuge es, eine Facebook-Spalte in der Benutzertabelle zu haben ... aber das liegt bei Ihnen.

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

und als solche meine Version von User.findOrCreate fängt so an:

function(accessToken, refreshToken, profile, done) {
    Membership.findOne({
        providerUserId: profile.id
    }, function(err,membershipData) {
            //blah blah blah

wobei die Zugehörigkeit das Modell oben ist und als Variable definiert ist als:

var Membership =  require('./models/membership.js')
67
MikeSmithDev

Wenn Sie findOrCreate verwenden möchten, versuchen Sie es mit dem Paket npm mongoose-findorcreate oder supergoose

z.B. mongoose-findorcreate

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost');

var findOrCreate = require('mongoose-findorcreate')
var Schema = mongoose.Schema;
var UserSchema = new Schema({ facebookId: Number});
UserSchema.plugin(findOrCreate);
var User = mongoose.model('User', UserSchema);

passport.use(new FacebookStrategy({
        clientID: 'clientID',
        clientSecret: 'clientSecret',
        callbackURL: "/auth/facebook/callback"
    },
    function(accessToken, refreshToken, profile, cb) {
        User.findOrCreate({ facebookId: profile.id }, function (err, user) {
          console.log('A new uxer from "%s" was inserted', user.facebookId);
          return cb(err, user);
        });
    }
));
3
Vinnie James