2016-12-09 1 views
1

passportJS로 사용자 인증을 설정하려고합니다. 필자는 mongoose-findorcreate라는 npm 패키지를 사용하여 findOrCreate 함수를 작성하여 여권으로 직접 작업하기로 결정했습니다.mongoose-findorcreate passport-facebook을 사용할 때 중복 된 사용자 작성

이제 내 앱을 테스트하고 있으며 내 페이스 북의 자격 증명을 사용하여 로그인 할 수 있지만 문제는 동일한 페이스 북 로그인을 위해 데이터베이스에 여러 항목을 가져 오는 것입니다.

let passport = require('passport'); 
let FacebookStrategy = require('passport-facebook').Strategy; 

let User = require('../models/user'); 

passport.use(new FacebookStrategy({ 
    clientID: 12345, 
    clientSecret: 'supersecretsecret', 
    callbackURL: 'http://localhost:1337/auth/facebook/callback' 
    }, 
    (accessToken, refreshToken, profile, done) => { 
    User.findOrCreate(profile, (err, user) => { 
     if (err) { 
     return done(err); 
     } 
     done(null, user); 
    }) 
    } 
)); 

passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 

passport.deserializeUser(function(id, done) { 
    User.findById(id, function(err, user) { 
    done(err, user); 
    }); 
}); 

function redirectFB() { 
    return passport.authenticate('facebook'); 
} 

function callbackFB() { 
    return passport.authenticate('facebook', { 
    successRedirect: '/word', 
    failureRedirect: '/' 
    }) 
} 

module.exports = { redirectFB, callbackFB }; 

중복 된 사용자의 예 :

{ 
    "_id":ObjectId("584ade8915644f1186fa8a96"), 
    "provider":"facebook", 
    "updatedAt": ISODate("2016-12-09T16:40:41.921 Z"), 
    "createdAt": ISODate("2016-12-09T16:40:41.921 Z"), 
    "photos":[ ], 
    "emails":[ ], 
    "displayName":"Miha Šušteršič", 
    "id":"10154914634234238", 
    "__v":0 
}{ 
    "_id":ObjectId("584adea3b8adfb11948ed1d6"), 
    "provider":"facebook", 
    "updatedAt": ISODate("2016-12-09T16:41:07.626 Z"), 
    "createdAt": ISODate("2016-12-09T16:41:07.625 Z"), 
    "photos":[ ], 
    "emails":[ ], 
    "displayName":"Miha Šušteršič", 
    "id":"10154914634234238", 
    "__v":0 
} 

나는이 있는지 알아낼 수 없습니다이 내 루트입니다

let mongoose = require('mongoose'); 
let Schema = mongoose.Schema; 

let findOrCreate = require('mongoose-findorcreate'); 

// User schema definition 
let UserSchema = new Schema(
    { 
    provider: { type: String, required: true }, 
    id: { type: String, default: 'unknown' }, 
    displayName: { type: String, default: 'unknown' }, 
    name: { type: Object }, 
    emails: { type: Array }, 
    photos: { type: Array }, 
    createdAt: { type: Date, default: Date.now }, 
    updatedAt: { type: Date, default: Date.now }, 
    } 
); 

UserSchema.plugin(findOrCreate); 

// Sets the updatedAt parameter equal to the current time 
UserSchema.pre('save', (next) => { 
    now = new Date(); 
    if(!this.updatedAt) { 
    this.updatedAt = now; 
    } 
    next(); 
}); 

module.exports = mongoose.model('user', UserSchema); 

:

이 내 사용자 모델입니다 내 코드에 문제가 있습니다 (프로필을 findOrCreate 함수에 전달했는지 여부).

답변

1

findOrCreate 쿼리는 쿼리 기준으로 전체 profile 객체를 전달하기 때문에 findOrCreate가 작동하지 않습니다 이유입니다.

당신이 여기 보면 : 프로파일 객체가 정확히 스키마와 일치하지 않는

https://github.com/drudge/mongoose-findorcreate/blob/master/index.js#L22은 다시 페이스 북에서 얻을 수있는 데이터의 유형에 따라 쿼리는 항상 빈 반환합니다.

당신이 여기에서 할 수있는 일은 이것이다 :

User.findOrCreate({ provider: profile.provider, id: profile.id, .... }, (err, user) => { 
    if (err) { 
    return done(err); 
    } 
    done(null, user); 
}) 

대신 물론 { provider: profile.provider, id: profile.id, .... }

에서 통과 profile의, 스키마 정의와 일치하는 { provider: profile.provider, id: profile.id, .... }를 해결.

0

찾기 - 사용자 데이터를 올바른 형식으로 findOrCreate 함수에 전달해야했습니다.

User.findOrCreate(profile._json, (err, user) => { 
     if (err) { 
     return done(err); 
     } 
     done(null, user); 
    }) 
관련 문제