Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const {jwtConfig} = require('./config'),
- app = require('express')(),
- {Router} = require('express'),
- router = Router(),
- session = require('express-session'),
- {urlencoded,json} = require('body-parser'),
- {sign} = require('jsonwebtoken'),
- passport = require('passport'),
- {Strategy} = require('passport-jwt'),
- {hashSync,compareSync, genSaltSync} = require('bcryptjs'),
- mongoose = require('mongoose'),
- {connection, Schema} = mongoose,
- LocalStrategy = require('passport-local')
- //helpers
- const signToken = _id => sign({_id}, 'secret')
- //config db
- mongoose.Promise = global.Promise
- mongoose.connect('mongodb://localhost/api-starter')
- connection.on('error', console.error.bind(console, 'connection error: '))
- connection.once('open', ()=>console.log('connected to DB!'))
- //set up model
- const userSchema = new Schema({
- email: {
- type: String,
- required: [true, 'Must provide an email'],
- unique: true,
- match: [/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/, 'Please provide a valid email']
- },
- username: {
- type:String,
- unique: true,
- required: [true, 'Must provide a username'],
- },
- password:{
- type: String,
- required: [true, 'Must provide a password'],
- },
- admin: {
- type:Boolean,
- required: [true, 'Is this user and admin?'],
- }
- })
- userSchema.pre('save', function(next){
- this.password = hashSync(this.password, genSaltSync(10))
- next()
- })
- const User = mongoose.model('User', userSchema)
- //strategies
- const checkPass = new LocalStrategy( (username, password, done)=> User.findOne({username})
- .then(userFromDB => compareSync(password, userFromDB.password) ? done(null, userFromDB): done(null, false))
- .catch(e=>done(e)))
- passport.use('grantToken',checkPass)
- router.post('/users/authenticate', passport.authenticate('grantToken', {session:false}), (req,res)=>{
- res.json({token: signToken(req.user._id)})
- })
- const jwtRequest = new Strategy(jwtConfig, (verified, done) => User.findById(verified._id)
- .then(userFromDB => userFromDB ? done(null, userFromDB) : done(null, false) ))
- //routes
- router.post('/users', (req, res)=> User.findOne({email:req.body.email})
- .then(userFromDB=> userFromDB ?
- res.status(422).json({errors:{username:{message: 'Email already in use'} }})
- : new User(req.body).save()
- .then(savedUser=>res.json({token: signToken(savedUser._id)}))
- ).catch(e=> e.errmsg ? res.status(422).json({errors:{username:{message: 'Username already in use'} }})
- :res.status(422).send(e))
- )
- //mids
- app.use(urlencoded({extended: true}))
- app.use(json())
- app.use(passport.initialize())
- app.use('/api', router)
- app.listen(3090, console.log(`listening on 3090`))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement