Guest User

Untitled

a guest
Nov 21st, 2018
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.28 KB | None | 0 0
  1. const Koa = require('koa')
  2. const Router = require('koa-router')
  3. const { createLogger, format: { printf }, transports } = require('winston')
  4.  
  5. const logger = createLogger({
  6. format: printf(info => info.message),
  7. transports: [
  8. new transports.Console()
  9. ]
  10. })
  11.  
  12. const app = new Koa()
  13. const router = new Router()
  14.  
  15. const bodyParser = require('koa-bodyparser')
  16.  
  17. app.use(bodyParser())
  18.  
  19. const mongoose = require('mongoose')
  20.  
  21. // you can create test db via mLab for this gist
  22. const connect = 'mongodb://user.password:57383/db'
  23.  
  24. mongoose
  25. // if you need
  26. // .set('debug', true)
  27. .connect(connect, {
  28. useNewUrlParser: true,
  29. useCreateIndex: true,
  30. useFindAndModify: false,
  31. keepAlive: 1,
  32. poolSize: 5
  33. })
  34.  
  35. const userSchema = new mongoose.Schema({
  36. login: {
  37. type: String,
  38. unique: true,
  39. lowercase: true,
  40. trim: true,
  41. required: true,
  42. default: () => Date.now().toString(32).slice(2)
  43. }
  44. })
  45.  
  46. const User = mongoose.model('User', userSchema)
  47.  
  48. const passport = require('koa-passport')
  49.  
  50. passport.serializeUser((user, done) => {
  51. logger.info('serializeUser')
  52.  
  53. done(null, user.id)
  54. })
  55.  
  56. passport.deserializeUser((id, done) => {
  57. logger.info('deserializeUser')
  58.  
  59. User.findById(id, done)
  60. })
  61.  
  62. const { Strategy, ExtractJwt } = require('passport-jwt')
  63.  
  64. passport.use(new Strategy({
  65. jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
  66. secretOrKey: 'customSecretKey',
  67. algorithms: 'HS512'
  68. }, (payload, done) => {
  69. logger.info('jwtStrategy')
  70.  
  71. User.findById(payload.id, (err, user) => {
  72. if (err) {
  73. return done(err, false)
  74. }
  75.  
  76. if (!user) {
  77. return done(null, false)
  78. }
  79.  
  80. return done(null, user)
  81. })
  82. }))
  83.  
  84. app.use(passport.initialize())
  85.  
  86. const auth = async (ctx, next) => {
  87. logger.info('startAuth')
  88.  
  89. logger.info('beforeKoaPassport')
  90.  
  91. // await next(), becaurse koa-passport return next()
  92. await passport.authenticate('jwt', { session: false })(ctx, next)
  93.  
  94. logger.info('afterKoaPassport')
  95.  
  96. if (!ctx.state.user) {
  97. ctx.throw(401, 'Unauthorized')
  98. }
  99.  
  100. logger.info('endAuth')
  101. }
  102.  
  103. const getUsers = async (ctx) => {
  104. logger.info('startGetUsers')
  105.  
  106. const users = await User.find({})
  107.  
  108. ctx.body = {
  109. payload: users
  110. }
  111.  
  112. logger.info('endGetUsers')
  113. }
  114.  
  115. router.get('/users', auth, getUsers)
  116.  
  117. app.use(router.routes()).use(router.allowedMethods())
  118.  
  119. app.listen(3000)
Add Comment
Please, Sign In to add comment