mirror of
https://github.com/wassname/talk.git
synced 2026-06-30 03:47:59 +08:00
85 lines
2.3 KiB
JavaScript
85 lines
2.3 KiB
JavaScript
const passport = require('passport');
|
|
const User = require('./models/user');
|
|
const LocalStrategy = require('passport-local').Strategy;
|
|
const FacebookStrategy = require('passport-facebook').Strategy;
|
|
|
|
//==============================================================================
|
|
// SESSION SERIALIZATION
|
|
//==============================================================================
|
|
|
|
passport.serializeUser((user, done) => {
|
|
done(null, user.id);
|
|
});
|
|
|
|
passport.deserializeUser((id, done) => {
|
|
User
|
|
.findById(id)
|
|
.then((user) => {
|
|
done(null, user);
|
|
})
|
|
.catch((err) => {
|
|
done(err);
|
|
});
|
|
});
|
|
|
|
/**
|
|
* Validates that a user is allowed to login.
|
|
* @param {User} user the user to be validated
|
|
* @param {Function} done the callback for the validation
|
|
*/
|
|
function ValidateUserLogin(user, done) {
|
|
if (!user) {
|
|
return done(new Error('user not found'));
|
|
}
|
|
|
|
if (user.disabled) {
|
|
return done(null, false, {message: 'Account disabled'});
|
|
}
|
|
|
|
return done(null, user);
|
|
}
|
|
|
|
//==============================================================================
|
|
// STRATEGIES
|
|
//==============================================================================
|
|
|
|
passport.use(new LocalStrategy({
|
|
usernameField: 'email',
|
|
passwordField: 'password'
|
|
}, (email, password, done) => {
|
|
User
|
|
.findLocalUser(email, password)
|
|
.then((user) => {
|
|
if (!user) {
|
|
return done(null, false, {message: 'Incorrect email/password combination'});
|
|
}
|
|
|
|
return ValidateUserLogin(user, done);
|
|
})
|
|
.catch((err) => {
|
|
done(err);
|
|
});
|
|
}));
|
|
|
|
if (process.env.TALK_FACEBOOK_APP_ID && process.env.TALK_FACEBOOK_APP_SECRET && process.env.TALK_ROOT_URL) {
|
|
passport.use(new FacebookStrategy({
|
|
clientID: process.env.TALK_FACEBOOK_APP_ID,
|
|
clientSecret: process.env.TALK_FACEBOOK_APP_SECRET,
|
|
callbackURL: `${process.env.TALK_ROOT_URL}/api/v1/auth/facebook/callback`,
|
|
profileFields: ['id', 'displayName', 'picture.type(large)']
|
|
}, (accessToken, refreshToken, profile, done) => {
|
|
User
|
|
.findOrCreateExternalUser(profile)
|
|
.then((user) =>
|
|
ValidateUserLogin(user, done)
|
|
)
|
|
.catch((err) => {
|
|
done(err);
|
|
});
|
|
}));
|
|
} else {
|
|
console.error('Facebook cannot be enabled, missing one of TALK_FACEBOOK_APP_ID, TALK_FACEBOOK_APP_SECRET, TALK_ROOT_URL');
|
|
}
|
|
|
|
module.exports = passport;
|