Instagram 経由と通常のローカル戦略の 2 つの戦略のいずれかでログインできるユーザー機能を提供したいと思います。ローカルの場合、DB でユーザーを検索し、そのユーザー情報を提供する簡単な関数を作成しました。これがどのように機能するかです:
passport.use(new InstagramStrategy({
clientID: global.INSTAGRAM_CLIENT_ID,
clientSecret: global.INSTAGRAM_CLIENT_SECRET,
callbackURL: "http://**.**.**.**:3000/auth/instagram/callback"
},
function(accessToken, refreshToken, profile, done) {
process.nextTick(function () {
console.log('Access token: ' + accessToken);
global.access_token = accessToken;
return done(null, profile);
});
}
));
passport.use(new LocalStrategy(
function(email, password, done) {
console.log('chec user');
process.nextTick(function() {
db.findByEmail(email, function(err, user) {
if (!user) {
console.log('Unknown user ' + email);
return done(null, false, {
message: 'Unknown user ' + email
});
}
if (user.password != crypt.getMD5fromString(password)) {
console.log('Invalid password');
return done(null, false, {
message: 'Invalid password'
});
}
return done(null, user);
})
});
}));
ただし、カスタムのシリアライズおよびデシリアライズ関数は、Instagram 戦略では機能しません。
/* THESE FUNCTIONS WORK WITH INSTAGRAM STRATEGY
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(obj, done) {
done(null, obj);
});*/
/*THESE ARE FOR LOCAL STRATEGY*/
passport.serializeUser(function(user, done) {done(null, user._id);});
passport.deserializeUser(function(id, done) {db.findById(id, function(err, user) {done(err, user);});});
このバグを回避するには?私の目的は、Instagram でのログインを提供することです。ログイン チェックが成功した後、ユーザーがローカル アカウント (電子メールまたは Instagram のニックネーム) を持っている場合は、DB からデータを取得します。ユーザーは、ローカル戦略を介して Instagram なしでログインできる必要があります。ありがとう。