Advertisement
Guest User

Untitled

a guest
Nov 27th, 2016
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.67 KB | None | 0 0
  1. const {jwtConfig} = require('./config'),
  2. app = require('express')(),
  3. {Router} = require('express'),
  4. router = Router(),
  5. session = require('express-session'),
  6. {urlencoded,json} = require('body-parser'),
  7. {sign} = require('jsonwebtoken'),
  8. passport = require('passport'),
  9. {Strategy} = require('passport-jwt'),
  10. {hashSync,compareSync, genSaltSync} = require('bcryptjs'),
  11. mongoose = require('mongoose'),
  12. {connection, Schema} = mongoose,
  13. LocalStrategy = require('passport-local')
  14.  
  15.  
  16. //helpers
  17. const signToken = _id => sign({_id}, 'secret')
  18.  
  19.  
  20. //config db
  21. mongoose.Promise = global.Promise
  22. mongoose.connect('mongodb://localhost/api-starter')
  23. connection.on('error', console.error.bind(console, 'connection error: '))
  24. connection.once('open', ()=>console.log('connected to DB!'))
  25.  
  26.  
  27. //set up model
  28. const userSchema = new Schema({
  29. email: {
  30. type: String,
  31. required: [true, 'Must provide an email'],
  32. unique: true,
  33. match: [/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/, 'Please provide a valid email']
  34. },
  35. username: {
  36. type:String,
  37. unique: true,
  38. required: [true, 'Must provide a username'],
  39. },
  40. password:{
  41. type: String,
  42. required: [true, 'Must provide a password'],
  43. },
  44. admin: {
  45. type:Boolean,
  46. required: [true, 'Is this user and admin?'],
  47. }
  48. })
  49.  
  50.  
  51. userSchema.pre('save', function(next){
  52. this.password = hashSync(this.password, genSaltSync(10))
  53. next()
  54. })
  55. const User = mongoose.model('User', userSchema)
  56.  
  57.  
  58.  
  59. //strategies
  60. const checkPass = new LocalStrategy( (username, password, done)=> User.findOne({username})
  61. .then(userFromDB => compareSync(password, userFromDB.password) ? done(null, userFromDB): done(null, false))
  62. .catch(e=>done(e)))
  63.  
  64. passport.use('grantToken',checkPass)
  65.  
  66.  
  67. router.post('/users/authenticate', passport.authenticate('grantToken', {session:false}), (req,res)=>{
  68. res.json({token: signToken(req.user._id)})
  69. })
  70.  
  71.  
  72. const jwtRequest = new Strategy(jwtConfig, (verified, done) => User.findById(verified._id)
  73. .then(userFromDB => userFromDB ? done(null, userFromDB) : done(null, false) ))
  74.  
  75.  
  76. //routes
  77. router.post('/users', (req, res)=> User.findOne({email:req.body.email})
  78. .then(userFromDB=> userFromDB ?
  79. res.status(422).json({errors:{username:{message: 'Email already in use'} }})
  80. : new User(req.body).save()
  81. .then(savedUser=>res.json({token: signToken(savedUser._id)}))
  82. ).catch(e=> e.errmsg ? res.status(422).json({errors:{username:{message: 'Username already in use'} }})
  83. :res.status(422).send(e))
  84. )
  85.  
  86.  
  87.  
  88.  
  89.  
  90. //mids
  91. app.use(urlencoded({extended: true}))
  92. app.use(json())
  93. app.use(passport.initialize())
  94. app.use('/api', router)
  95.  
  96.  
  97.  
  98. app.listen(3090, console.log(`listening on 3090`))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement