2016-05-17 21:50:37 +02:00
const passport = require ( 'passport' ) ;
2016-08-31 18:28:06 +02:00
const GitHubStrategy = require ( 'passport-github' ) . Strategy ;
2016-05-17 21:50:37 +02:00
const LocalStrategy = require ( 'passport-local' ) . Strategy ;
2016-06-27 19:09:18 +02:00
import User from '../models/user' ;
2016-05-17 21:50:37 +02:00
passport . serializeUser ( ( user , done ) => {
done ( null , user . id ) ;
} ) ;
passport . deserializeUser ( ( id , done ) => {
User . findById ( id , ( err , user ) => {
done ( err , user ) ;
} ) ;
} ) ;
/ * *
* Sign in using Email and Password .
* /
passport . use ( new LocalStrategy ( { usernameField : 'email' } , ( email , password , done ) => {
2016-06-27 19:09:18 +02:00
User . findOne ( { email : email . toLowerCase ( ) } , ( err , user ) => { // eslint-disable-line consistent-return
2016-06-25 00:08:52 +02:00
if ( ! user ) {
return done ( null , false , { msg : ` Email ${ email } not found. ` } ) ;
}
2016-06-27 19:09:18 +02:00
user . comparePassword ( password , ( innerErr , isMatch ) => {
2016-06-25 00:08:52 +02:00
if ( isMatch ) {
return done ( null , user ) ;
2016-05-17 21:50:37 +02:00
}
2016-06-25 00:08:52 +02:00
return done ( null , false , { msg : 'Invalid email or password.' } ) ;
2016-05-17 21:50:37 +02:00
} ) ;
2016-06-25 00:08:52 +02:00
} ) ;
2016-05-17 21:50:37 +02:00
} ) ) ;
/ * *
* Sign in with GitHub .
* /
2016-08-31 18:28:06 +02:00
passport . use ( new GitHubStrategy ( {
clientID : process . env . GITHUB _ID ,
clientSecret : process . env . GITHUB _SECRET ,
callbackURL : '/auth/github/callback' ,
passReqToCallback : true
} , ( req , accessToken , refreshToken , profile , done ) => {
if ( req . user ) {
User . findOne ( { github : profile . id } , ( err , existingUser ) => {
if ( existingUser ) {
req . flash ( 'errors' , { msg : 'There is already a GitHub account that belongs to you. Sign in with that account or delete it, then link it with your current account.' } ) ;
done ( err ) ;
} else {
User . findById ( req . user . id , ( err , user ) => {
user . github = profile . id ;
user . tokens . push ( { kind : 'github' , accessToken } ) ;
user . profile . name = user . profile . name || profile . displayName ;
user . profile . picture = user . profile . picture || profile . _json . avatar _url ;
user . profile . location = user . profile . location || profile . _json . location ;
user . profile . website = user . profile . website || profile . _json . blog ;
user . save ( ( err ) => {
req . flash ( 'info' , { msg : 'GitHub account has been linked.' } ) ;
done ( err , user ) ;
} ) ;
} ) ;
}
} ) ;
} else {
User . findOne ( { github : profile . id } , ( err , existingUser ) => {
if ( existingUser ) {
return done ( null , existingUser ) ;
}
User . findOne ( { email : profile . _json . email } , ( err , existingEmailUser ) => {
if ( existingEmailUser ) {
req . flash ( 'errors' , { msg : 'There is already an account using this email address. Sign in to that account and link it with GitHub manually from Account Settings.' } ) ;
done ( err ) ;
} else {
const user = new User ( ) ;
user . email = profile . _json . email ;
user . github = profile . id ;
user . tokens . push ( { kind : 'github' , accessToken } ) ;
user . profile . name = profile . displayName ;
user . profile . picture = profile . _json . avatar _url ;
user . profile . location = profile . _json . location ;
user . profile . website = profile . _json . blog ;
user . save ( ( err ) => {
done ( err , user ) ;
} ) ;
}
} ) ;
} ) ;
}
} ) ) ;