Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //imports
- const app = require('express')(),
- session = require('express-session'),
- bodyParser = require('body-parser'),
- jwt = require('jsonwebtoken'),
- passport = require('passport'),
- {Strategy, ExtractJwt} = require('passport-jwt'),
- LocalStrategy = require('passport-local'),
- FacebookStrategy = require('passport-facebook'),
- TwitterStrategy = require('passport-twitter'),
- GoogleStrategy = require('passport-google-oauth').OAuth2Strategy,
- {fb, twitter, google} = require('./authInfo'),
- {hashSync,compareSync, genSaltSync} = require('bcryptjs'),
- mongoose = require('mongoose'),
- {connection, Schema}=mongoose
- //db config
- mongoose.Promise=global.Promise
- mongoose.connect('mongodb://localhost/test')
- connection.on('error', console.error.bind(console, 'connection error:'));
- connection.once('open', ()=> console.log('connected to DB!'))
- //model setup
- const userSchema = new Schema({username: String, password: String})
- userSchema.pre('save', function(next){
- this.password=hashSync(this.password, genSaltSync(10))
- next()
- })
- const User = mongoose.model('User', userSchema)
- //global mids
- app.use(bodyParser.urlencoded({ extended: true }))
- app.use(bodyParser.json())
- app.use(session({secret:'secret',resave: true,saveUninitialized: true}))
- app.use(passport.initialize())
- app.use(passport.session())
- //strategies
- const userLogin = new LocalStrategy((username, password, done)=>{
- User.findOne({username})
- .then(userFromDB=>{
- compareSync(password, userFromDB.password) ? done(null, userFromDB) : done(null, false)
- }).catch(e=>done(e))
- })
- const jwtOptions={
- jwtFromRequest: ExtractJwt.fromHeader("authorization"),
- secretOrKey: 'secret'
- }
- const jwtLogin = new Strategy(jwtOptions, (fromPassport, done)=>{
- User.findById(fromPassport._id)
- .then(userFromDB=>{userFromDB ? done(null, userFromDB) : done(null, false)
- }).catch(e=>done(e))
- })
- const fbLogin = new FacebookStrategy(fb, (accessToken, refreshToken, profile, done)=> done(null, profile))
- const twitterLogin = new TwitterStrategy(twitter, (token, tokenSecret, profile, done)=>done(null, profile))
- const googleLogin = new GoogleStrategy(google, (accessToken, refreshToken, profile, done)=>done(null, profile))
- passport.use('local',userLogin)
- passport.use('jwt',jwtLogin)
- passport.use('facebook',fbLogin)
- passport.use('twitter',twitterLogin)
- passport.use('google',googleLogin)
- passport.serializeUser((user, done)=>done(null, user.id))
- passport.deserializeUser((id, done)=>User.findById(id).then(userFromDB=>done(user)))
- const signToken = _id=>jwt.sign({_id}, "secret" )
- app.get('/', passport.authenticate('jwt', {session:false}), (req,res)=> res.send('Protected Resource'))
- app.get('/auth/facebook', passport.authenticate('facebook'))
- app.get('/auth/facebook/callback', passport.authenticate('facebook', {session:false}), (req, res)=> res.send(req.user))
- app.get('/auth/google', passport.authenticate('google', { scope : ['profile', 'email'] } ))
- app.get('/auth/google/callback', passport.authenticate('google'), (req, res)=> res.send(req.user))
- app.get('/auth/twitter', passport.authenticate('twitter'))
- app.get('/auth/twitter/callback', passport.authenticate('twitter'), (req, res)=> res.send(req.user))
- app.post('/signup', (req, res)=>{
- const {username, password} = req.body
- User.findOne({username})
- .then(userFromDB=>{
- if(userFromDB) res.status(422).send('Username is already use')
- else if (!username || !password) res.status(422).send('Must provide an username and password')
- else new User(req.body).save().then(savedUser=>res.json({token: signToken(savedUser._id)}))
- }).catch(e=>res.status(400).send(e.message))
- })
- app.post('/signin', passport.authenticate('local', {session:false}), (req,res)=>{
- res.json({token: signToken(req.user._id)})
- })
- app.listen(process.env.PORT, console.log(`on ${process.env.PORT}`))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement