├── .gitignore ├── README.md ├── index.js ├── package-lock.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | tut.js 3 | models.js -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # jwt-passport-mysql 2 | 3 | A Restful API implementating authentication using JsonWebToken with MySQL Sequelize-ORM 4 | 5 | Database : MySQL 6 | ORM : Sequelize 7 | Authentication : Passport, JWT 8 | 9 | [Here](https://medium.com/devc-kano/basics-of-authentication-using-passport-and-jwt-with-sequelize-and-mysql-database-748e09d01bab) is an article that goes over the code -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const bodyParser = require('body-parser'); 3 | const jwt = require('jsonwebtoken'); 4 | // const _ = require('lodash'); 5 | 6 | const passport = require('passport'); 7 | const passportJWT = require('passport-jwt'); 8 | 9 | let ExtractJwt = passportJWT.ExtractJwt; 10 | let JwtStrategy = passportJWT.Strategy; 11 | 12 | let jwtOptions = {}; 13 | jwtOptions.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken(); 14 | jwtOptions.secretOrKey = 'wowwow'; 15 | 16 | // lets create our strategy for web token 17 | let strategy = new JwtStrategy(jwtOptions, function(jwt_payload, next) { 18 | console.log('payload received', jwt_payload); 19 | let user = getUser({ id: jwt_payload.id }); 20 | 21 | if (user) { 22 | next(null, user); 23 | } else { 24 | next(null, false); 25 | } 26 | }); 27 | // use the strategy 28 | passport.use(strategy); 29 | 30 | const app = express(); 31 | // initialize passport with express 32 | app.use(passport.initialize()); 33 | 34 | // parse application/json 35 | app.use(bodyParser.json()); 36 | //parse application/x-www-form-urlencoded 37 | app.use(bodyParser.urlencoded({ extended: true })); 38 | 39 | const Sequelize = require('sequelize'); 40 | 41 | // initialze an instance of Sequelize 42 | const sequelize = new Sequelize({ 43 | database: 'test_sequelize', 44 | username: 'root', 45 | password: '', 46 | dialect: 'mysql', 47 | }); 48 | 49 | // check the databse connection 50 | sequelize 51 | .authenticate() 52 | .then(() => console.log('Connection has been established successfully.')) 53 | .catch(err => console.error('Unable to connect to the database:', err)); 54 | 55 | // create user model 56 | const User = sequelize.define('user', { 57 | name: { 58 | type: Sequelize.STRING, 59 | }, 60 | password: { 61 | type: Sequelize.STRING, 62 | }, 63 | }); 64 | 65 | // create table with user model 66 | User.sync() 67 | .then(() => console.log('User table created successfully')) 68 | .catch(err => console.log('oooh, did you enter wrong database credentials?')); 69 | 70 | // create some helper functions to work on the database 71 | const createUser = async ({ name, password }) => { 72 | return await User.create({ name, password }); 73 | }; 74 | 75 | const getAllUsers = async () => { 76 | return await User.findAll(); 77 | }; 78 | 79 | const getUser = async obj => { 80 | return await User.findOne({ 81 | where: obj, 82 | }); 83 | }; 84 | 85 | // set some basic routes 86 | app.get('/', function(req, res) { 87 | res.json({ message: 'Express is up!' }); 88 | }); 89 | 90 | // get all users 91 | app.get('/users', function(req, res) { 92 | getAllUsers().then(user => res.json(user)); 93 | }); 94 | 95 | // register route 96 | app.post('/register', function(req, res, next) { 97 | const { name, password } = req.body; 98 | createUser({ name, password }).then(user => 99 | res.json({ user, msg: 'account created successfully' }) 100 | ); 101 | }); 102 | 103 | //login route 104 | app.post('/login', async function(req, res, next) { 105 | const { name, password } = req.body; 106 | if (name && password) { 107 | let user = await getUser({ name: name }); 108 | if (!user) { 109 | res.status(401).json({ message: 'No such user found' }); 110 | } 111 | if (user.password === password) { 112 | // from now on we'll identify the user by the id and the id is the 113 | // only personalized value that goes into our token 114 | let payload = { id: user.id }; 115 | let token = jwt.sign(payload, jwtOptions.secretOrKey); 116 | res.json({ msg: 'ok', token: token }); 117 | } else { 118 | res.status(401).json({ msg: 'Password is incorrect' }); 119 | } 120 | } 121 | }); 122 | 123 | // protected route 124 | app.get('/protected', passport.authenticate('jwt', { session: false }), function(req, res) { 125 | res.json('Success! You can now see this without a token.'); 126 | }); 127 | 128 | // start app 129 | app.listen(3000, function() { 130 | console.log('Express is running on port 3000'); 131 | }); 132 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "express-jwt-sequelize-mysql", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/geojson": { 8 | "version": "1.0.6", 9 | "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-1.0.6.tgz", 10 | "integrity": "sha512-Xqg/lIZMrUd0VRmSRbCAewtwGZiAk3mEUDvV4op1tGl+LvyPcb/MIOSxTl9z+9+J+R4/vpjiCAT4xeKzH9ji1w==" 11 | }, 12 | "@types/node": { 13 | "version": "10.12.18", 14 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", 15 | "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==" 16 | }, 17 | "accepts": { 18 | "version": "1.3.5", 19 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 20 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 21 | "requires": { 22 | "mime-types": "~2.1.18", 23 | "negotiator": "0.6.1" 24 | } 25 | }, 26 | "array-flatten": { 27 | "version": "1.1.1", 28 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 29 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 30 | }, 31 | "bluebird": { 32 | "version": "3.5.3", 33 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", 34 | "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==" 35 | }, 36 | "body-parser": { 37 | "version": "1.18.3", 38 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 39 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 40 | "requires": { 41 | "bytes": "3.0.0", 42 | "content-type": "~1.0.4", 43 | "debug": "2.6.9", 44 | "depd": "~1.1.2", 45 | "http-errors": "~1.6.3", 46 | "iconv-lite": "0.4.23", 47 | "on-finished": "~2.3.0", 48 | "qs": "6.5.2", 49 | "raw-body": "2.3.3", 50 | "type-is": "~1.6.16" 51 | } 52 | }, 53 | "buffer-equal-constant-time": { 54 | "version": "1.0.1", 55 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 56 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 57 | }, 58 | "bytes": { 59 | "version": "3.0.0", 60 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 61 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 62 | }, 63 | "cls-bluebird": { 64 | "version": "2.1.0", 65 | "resolved": "https://registry.npmjs.org/cls-bluebird/-/cls-bluebird-2.1.0.tgz", 66 | "integrity": "sha1-N+8eCAqP+1XC9BZPU28ZGeeWiu4=", 67 | "requires": { 68 | "is-bluebird": "^1.0.2", 69 | "shimmer": "^1.1.0" 70 | } 71 | }, 72 | "content-disposition": { 73 | "version": "0.5.2", 74 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 75 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 76 | }, 77 | "content-type": { 78 | "version": "1.0.4", 79 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 80 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 81 | }, 82 | "cookie": { 83 | "version": "0.3.1", 84 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 85 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 86 | }, 87 | "cookie-signature": { 88 | "version": "1.0.6", 89 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 90 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 91 | }, 92 | "debug": { 93 | "version": "2.6.9", 94 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 95 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 96 | "requires": { 97 | "ms": "2.0.0" 98 | } 99 | }, 100 | "denque": { 101 | "version": "1.3.0", 102 | "resolved": "https://registry.npmjs.org/denque/-/denque-1.3.0.tgz", 103 | "integrity": "sha512-4SRaSj+PqmrS1soW5/Avd7eJIM2JJIqLLmwhRqIGleZM/8KwZq80njbSS2Iqas+6oARkSkLDHEk4mm78q3JlIg==" 104 | }, 105 | "depd": { 106 | "version": "1.1.2", 107 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 108 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 109 | }, 110 | "destroy": { 111 | "version": "1.0.4", 112 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 113 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 114 | }, 115 | "dottie": { 116 | "version": "2.0.1", 117 | "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.1.tgz", 118 | "integrity": "sha512-ch5OQgvGDK2u8pSZeSYAQaV/lczImd7pMJ7BcEPXmnFVjy4yJIzP6CsODJUTH8mg1tyH1Z2abOiuJO3DjZ/GBw==" 119 | }, 120 | "ecdsa-sig-formatter": { 121 | "version": "1.0.10", 122 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz", 123 | "integrity": "sha1-HFlQAPBKiJffuFAAiSoPTDOvhsM=", 124 | "requires": { 125 | "safe-buffer": "^5.0.1" 126 | } 127 | }, 128 | "ee-first": { 129 | "version": "1.1.1", 130 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 131 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 132 | }, 133 | "encodeurl": { 134 | "version": "1.0.2", 135 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 136 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 137 | }, 138 | "escape-html": { 139 | "version": "1.0.3", 140 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 141 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 142 | }, 143 | "etag": { 144 | "version": "1.8.1", 145 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 146 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 147 | }, 148 | "express": { 149 | "version": "4.16.4", 150 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 151 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 152 | "requires": { 153 | "accepts": "~1.3.5", 154 | "array-flatten": "1.1.1", 155 | "body-parser": "1.18.3", 156 | "content-disposition": "0.5.2", 157 | "content-type": "~1.0.4", 158 | "cookie": "0.3.1", 159 | "cookie-signature": "1.0.6", 160 | "debug": "2.6.9", 161 | "depd": "~1.1.2", 162 | "encodeurl": "~1.0.2", 163 | "escape-html": "~1.0.3", 164 | "etag": "~1.8.1", 165 | "finalhandler": "1.1.1", 166 | "fresh": "0.5.2", 167 | "merge-descriptors": "1.0.1", 168 | "methods": "~1.1.2", 169 | "on-finished": "~2.3.0", 170 | "parseurl": "~1.3.2", 171 | "path-to-regexp": "0.1.7", 172 | "proxy-addr": "~2.0.4", 173 | "qs": "6.5.2", 174 | "range-parser": "~1.2.0", 175 | "safe-buffer": "5.1.2", 176 | "send": "0.16.2", 177 | "serve-static": "1.13.2", 178 | "setprototypeof": "1.1.0", 179 | "statuses": "~1.4.0", 180 | "type-is": "~1.6.16", 181 | "utils-merge": "1.0.1", 182 | "vary": "~1.1.2" 183 | }, 184 | "dependencies": { 185 | "statuses": { 186 | "version": "1.4.0", 187 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 188 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 189 | } 190 | } 191 | }, 192 | "finalhandler": { 193 | "version": "1.1.1", 194 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 195 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 196 | "requires": { 197 | "debug": "2.6.9", 198 | "encodeurl": "~1.0.2", 199 | "escape-html": "~1.0.3", 200 | "on-finished": "~2.3.0", 201 | "parseurl": "~1.3.2", 202 | "statuses": "~1.4.0", 203 | "unpipe": "~1.0.0" 204 | }, 205 | "dependencies": { 206 | "statuses": { 207 | "version": "1.4.0", 208 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 209 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 210 | } 211 | } 212 | }, 213 | "forwarded": { 214 | "version": "0.1.2", 215 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 216 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 217 | }, 218 | "fresh": { 219 | "version": "0.5.2", 220 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 221 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 222 | }, 223 | "generate-function": { 224 | "version": "2.3.1", 225 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", 226 | "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", 227 | "requires": { 228 | "is-property": "^1.0.2" 229 | } 230 | }, 231 | "generic-pool": { 232 | "version": "3.4.2", 233 | "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.4.2.tgz", 234 | "integrity": "sha512-H7cUpwCQSiJmAHM4c/aFu6fUfrhWXW1ncyh8ftxEPMu6AiYkHw9K8br720TGPZJbk5eOH2bynjZD1yPvdDAmag==" 235 | }, 236 | "http-errors": { 237 | "version": "1.6.3", 238 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 239 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 240 | "requires": { 241 | "depd": "~1.1.2", 242 | "inherits": "2.0.3", 243 | "setprototypeof": "1.1.0", 244 | "statuses": ">= 1.4.0 < 2" 245 | } 246 | }, 247 | "iconv-lite": { 248 | "version": "0.4.23", 249 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 250 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 251 | "requires": { 252 | "safer-buffer": ">= 2.1.2 < 3" 253 | } 254 | }, 255 | "inflection": { 256 | "version": "1.12.0", 257 | "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", 258 | "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=" 259 | }, 260 | "inherits": { 261 | "version": "2.0.3", 262 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 263 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 264 | }, 265 | "ipaddr.js": { 266 | "version": "1.8.0", 267 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 268 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" 269 | }, 270 | "is-bluebird": { 271 | "version": "1.0.2", 272 | "resolved": "https://registry.npmjs.org/is-bluebird/-/is-bluebird-1.0.2.tgz", 273 | "integrity": "sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI=" 274 | }, 275 | "is-property": { 276 | "version": "1.0.2", 277 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", 278 | "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" 279 | }, 280 | "jsonwebtoken": { 281 | "version": "8.4.0", 282 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.4.0.tgz", 283 | "integrity": "sha512-coyXjRTCy0pw5WYBpMvWOMN+Kjaik2MwTUIq9cna/W7NpO9E+iYbumZONAz3hcr+tXFJECoQVrtmIoC3Oz0gvg==", 284 | "requires": { 285 | "jws": "^3.1.5", 286 | "lodash.includes": "^4.3.0", 287 | "lodash.isboolean": "^3.0.3", 288 | "lodash.isinteger": "^4.0.4", 289 | "lodash.isnumber": "^3.0.3", 290 | "lodash.isplainobject": "^4.0.6", 291 | "lodash.isstring": "^4.0.1", 292 | "lodash.once": "^4.0.0", 293 | "ms": "^2.1.1" 294 | }, 295 | "dependencies": { 296 | "ms": { 297 | "version": "2.1.1", 298 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 299 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 300 | } 301 | } 302 | }, 303 | "jwa": { 304 | "version": "1.1.6", 305 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.6.tgz", 306 | "integrity": "sha512-tBO/cf++BUsJkYql/kBbJroKOgHWEigTKBAjjBEmrMGYd1QMBC74Hr4Wo2zCZw6ZrVhlJPvoMrkcOnlWR/DJfw==", 307 | "requires": { 308 | "buffer-equal-constant-time": "1.0.1", 309 | "ecdsa-sig-formatter": "1.0.10", 310 | "safe-buffer": "^5.0.1" 311 | } 312 | }, 313 | "jws": { 314 | "version": "3.1.5", 315 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.5.tgz", 316 | "integrity": "sha512-GsCSexFADNQUr8T5HPJvayTjvPIfoyJPtLQBwn5a4WZQchcrPMPMAWcC1AzJVRDKyD6ZPROPAxgv6rfHViO4uQ==", 317 | "requires": { 318 | "jwa": "^1.1.5", 319 | "safe-buffer": "^5.0.1" 320 | } 321 | }, 322 | "lodash": { 323 | "version": "4.17.11", 324 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 325 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" 326 | }, 327 | "lodash.includes": { 328 | "version": "4.3.0", 329 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 330 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" 331 | }, 332 | "lodash.isboolean": { 333 | "version": "3.0.3", 334 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 335 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" 336 | }, 337 | "lodash.isinteger": { 338 | "version": "4.0.4", 339 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 340 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" 341 | }, 342 | "lodash.isnumber": { 343 | "version": "3.0.3", 344 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 345 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" 346 | }, 347 | "lodash.isplainobject": { 348 | "version": "4.0.6", 349 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 350 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 351 | }, 352 | "lodash.isstring": { 353 | "version": "4.0.1", 354 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 355 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 356 | }, 357 | "lodash.once": { 358 | "version": "4.1.1", 359 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 360 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" 361 | }, 362 | "long": { 363 | "version": "4.0.0", 364 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 365 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 366 | }, 367 | "lru-cache": { 368 | "version": "4.1.3", 369 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", 370 | "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", 371 | "requires": { 372 | "pseudomap": "^1.0.2", 373 | "yallist": "^2.1.2" 374 | } 375 | }, 376 | "media-typer": { 377 | "version": "0.3.0", 378 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 379 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 380 | }, 381 | "merge-descriptors": { 382 | "version": "1.0.1", 383 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 384 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 385 | }, 386 | "methods": { 387 | "version": "1.1.2", 388 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 389 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 390 | }, 391 | "mime": { 392 | "version": "1.4.1", 393 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 394 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 395 | }, 396 | "mime-db": { 397 | "version": "1.37.0", 398 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 399 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" 400 | }, 401 | "mime-types": { 402 | "version": "2.1.21", 403 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 404 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 405 | "requires": { 406 | "mime-db": "~1.37.0" 407 | } 408 | }, 409 | "moment": { 410 | "version": "2.23.0", 411 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.23.0.tgz", 412 | "integrity": "sha512-3IE39bHVqFbWWaPOMHZF98Q9c3LDKGTmypMiTM2QygGXXElkFWIH7GxfmlwmY2vwa+wmNsoYZmG2iusf1ZjJoA==" 413 | }, 414 | "moment-timezone": { 415 | "version": "0.5.23", 416 | "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.23.tgz", 417 | "integrity": "sha512-WHFH85DkCfiNMDX5D3X7hpNH3/PUhjTGcD0U1SgfBGZxJ3qUmJh5FdvaFjcClxOvB3rzdfj4oRffbI38jEnC1w==", 418 | "requires": { 419 | "moment": ">= 2.9.0" 420 | } 421 | }, 422 | "ms": { 423 | "version": "2.0.0", 424 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 425 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 426 | }, 427 | "mysql2": { 428 | "version": "1.6.4", 429 | "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-1.6.4.tgz", 430 | "integrity": "sha512-ZYbYgK06HKfxU45tYYLfwW5gKt8BslfE7FGyULNrf2K2fh+DuEX+e0QKsd2ObpZkMILefaVn8hsakVsTFqravQ==", 431 | "requires": { 432 | "denque": "1.3.0", 433 | "generate-function": "^2.3.1", 434 | "iconv-lite": "^0.4.24", 435 | "long": "^4.0.0", 436 | "lru-cache": "4.1.3", 437 | "named-placeholders": "1.1.1", 438 | "seq-queue": "0.0.5", 439 | "sqlstring": "2.3.1" 440 | }, 441 | "dependencies": { 442 | "iconv-lite": { 443 | "version": "0.4.24", 444 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 445 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 446 | "requires": { 447 | "safer-buffer": ">= 2.1.2 < 3" 448 | } 449 | } 450 | } 451 | }, 452 | "named-placeholders": { 453 | "version": "1.1.1", 454 | "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.1.tgz", 455 | "integrity": "sha1-O3oNJiA910s6nfTJz7gnsvuQfmQ=", 456 | "requires": { 457 | "lru-cache": "2.5.0" 458 | }, 459 | "dependencies": { 460 | "lru-cache": { 461 | "version": "2.5.0", 462 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", 463 | "integrity": "sha1-2COIrpyWC+y+oMc7uet5tsbOmus=" 464 | } 465 | } 466 | }, 467 | "negotiator": { 468 | "version": "0.6.1", 469 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 470 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 471 | }, 472 | "on-finished": { 473 | "version": "2.3.0", 474 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 475 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 476 | "requires": { 477 | "ee-first": "1.1.1" 478 | } 479 | }, 480 | "parseurl": { 481 | "version": "1.3.2", 482 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 483 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 484 | }, 485 | "passport": { 486 | "version": "0.4.0", 487 | "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.0.tgz", 488 | "integrity": "sha1-xQlWkTR71a07XhgCOMORTRbwWBE=", 489 | "requires": { 490 | "passport-strategy": "1.x.x", 491 | "pause": "0.0.1" 492 | } 493 | }, 494 | "passport-jwt": { 495 | "version": "4.0.0", 496 | "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.0.tgz", 497 | "integrity": "sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg==", 498 | "requires": { 499 | "jsonwebtoken": "^8.2.0", 500 | "passport-strategy": "^1.0.0" 501 | } 502 | }, 503 | "passport-strategy": { 504 | "version": "1.0.0", 505 | "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", 506 | "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" 507 | }, 508 | "path-to-regexp": { 509 | "version": "0.1.7", 510 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 511 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 512 | }, 513 | "pause": { 514 | "version": "0.0.1", 515 | "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", 516 | "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" 517 | }, 518 | "proxy-addr": { 519 | "version": "2.0.4", 520 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", 521 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", 522 | "requires": { 523 | "forwarded": "~0.1.2", 524 | "ipaddr.js": "1.8.0" 525 | } 526 | }, 527 | "pseudomap": { 528 | "version": "1.0.2", 529 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 530 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 531 | }, 532 | "qs": { 533 | "version": "6.5.2", 534 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 535 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 536 | }, 537 | "range-parser": { 538 | "version": "1.2.0", 539 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 540 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 541 | }, 542 | "raw-body": { 543 | "version": "2.3.3", 544 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 545 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 546 | "requires": { 547 | "bytes": "3.0.0", 548 | "http-errors": "1.6.3", 549 | "iconv-lite": "0.4.23", 550 | "unpipe": "1.0.0" 551 | } 552 | }, 553 | "retry-as-promised": { 554 | "version": "2.3.2", 555 | "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-2.3.2.tgz", 556 | "integrity": "sha1-zZdO5P2bX+A8vzGHHuSCIcB3N7c=", 557 | "requires": { 558 | "bluebird": "^3.4.6", 559 | "debug": "^2.6.9" 560 | } 561 | }, 562 | "safe-buffer": { 563 | "version": "5.1.2", 564 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 565 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 566 | }, 567 | "safer-buffer": { 568 | "version": "2.1.2", 569 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 570 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 571 | }, 572 | "semver": { 573 | "version": "5.6.0", 574 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 575 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" 576 | }, 577 | "send": { 578 | "version": "0.16.2", 579 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 580 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 581 | "requires": { 582 | "debug": "2.6.9", 583 | "depd": "~1.1.2", 584 | "destroy": "~1.0.4", 585 | "encodeurl": "~1.0.2", 586 | "escape-html": "~1.0.3", 587 | "etag": "~1.8.1", 588 | "fresh": "0.5.2", 589 | "http-errors": "~1.6.2", 590 | "mime": "1.4.1", 591 | "ms": "2.0.0", 592 | "on-finished": "~2.3.0", 593 | "range-parser": "~1.2.0", 594 | "statuses": "~1.4.0" 595 | }, 596 | "dependencies": { 597 | "statuses": { 598 | "version": "1.4.0", 599 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 600 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 601 | } 602 | } 603 | }, 604 | "seq-queue": { 605 | "version": "0.0.5", 606 | "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", 607 | "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" 608 | }, 609 | "sequelize": { 610 | "version": "4.42.0", 611 | "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-4.42.0.tgz", 612 | "integrity": "sha512-qxAYnX4rcv7PbNtEidb56REpxNJCdbN0qyk1jb3+e6sE7OrmS0nYMU+MFVbNTJtZfSpOEEL1TX0TkMw+wzZBxg==", 613 | "requires": { 614 | "bluebird": "^3.5.0", 615 | "cls-bluebird": "^2.1.0", 616 | "debug": "^3.1.0", 617 | "depd": "^1.1.0", 618 | "dottie": "^2.0.0", 619 | "generic-pool": "^3.4.0", 620 | "inflection": "1.12.0", 621 | "lodash": "^4.17.1", 622 | "moment": "^2.20.0", 623 | "moment-timezone": "^0.5.14", 624 | "retry-as-promised": "^2.3.2", 625 | "semver": "^5.5.0", 626 | "terraformer-wkt-parser": "^1.1.2", 627 | "toposort-class": "^1.0.1", 628 | "uuid": "^3.2.1", 629 | "validator": "^10.4.0", 630 | "wkx": "^0.4.1" 631 | }, 632 | "dependencies": { 633 | "debug": { 634 | "version": "3.2.6", 635 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 636 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 637 | "requires": { 638 | "ms": "^2.1.1" 639 | } 640 | }, 641 | "ms": { 642 | "version": "2.1.1", 643 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 644 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 645 | } 646 | } 647 | }, 648 | "serve-static": { 649 | "version": "1.13.2", 650 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 651 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 652 | "requires": { 653 | "encodeurl": "~1.0.2", 654 | "escape-html": "~1.0.3", 655 | "parseurl": "~1.3.2", 656 | "send": "0.16.2" 657 | } 658 | }, 659 | "setprototypeof": { 660 | "version": "1.1.0", 661 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 662 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 663 | }, 664 | "shimmer": { 665 | "version": "1.2.0", 666 | "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.0.tgz", 667 | "integrity": "sha512-xTCx2vohXC2EWWDqY/zb4+5Mu28D+HYNSOuFzsyRDRvI/e1ICb69afwaUwfjr+25ZXldbOLyp+iDUZHq8UnTag==" 668 | }, 669 | "sqlstring": { 670 | "version": "2.3.1", 671 | "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", 672 | "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=" 673 | }, 674 | "statuses": { 675 | "version": "1.5.0", 676 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 677 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 678 | }, 679 | "terraformer": { 680 | "version": "1.0.9", 681 | "resolved": "https://registry.npmjs.org/terraformer/-/terraformer-1.0.9.tgz", 682 | "integrity": "sha512-YlmQ1fsMWTkKGDGibCRWgmLzrpDRUr63Q025LJ/taYQ6j1Yb8q9McKF7NBi6ACAyUXO6F/bl9w6v4MY307y5Ag==", 683 | "requires": { 684 | "@types/geojson": "^1.0.0" 685 | } 686 | }, 687 | "terraformer-wkt-parser": { 688 | "version": "1.2.0", 689 | "resolved": "https://registry.npmjs.org/terraformer-wkt-parser/-/terraformer-wkt-parser-1.2.0.tgz", 690 | "integrity": "sha512-QU3iA54St5lF8Za1jg1oj4NYc8sn5tCZ08aNSWDeGzrsaV48eZk1iAVWasxhNspYBoCqdHuoot1pUTUrE1AJ4w==", 691 | "requires": { 692 | "@types/geojson": "^1.0.0", 693 | "terraformer": "~1.0.5" 694 | } 695 | }, 696 | "toposort-class": { 697 | "version": "1.0.1", 698 | "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", 699 | "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" 700 | }, 701 | "type-is": { 702 | "version": "1.6.16", 703 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 704 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 705 | "requires": { 706 | "media-typer": "0.3.0", 707 | "mime-types": "~2.1.18" 708 | } 709 | }, 710 | "unpipe": { 711 | "version": "1.0.0", 712 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 713 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 714 | }, 715 | "utils-merge": { 716 | "version": "1.0.1", 717 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 718 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 719 | }, 720 | "uuid": { 721 | "version": "3.3.2", 722 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 723 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 724 | }, 725 | "validator": { 726 | "version": "10.10.0", 727 | "resolved": "https://registry.npmjs.org/validator/-/validator-10.10.0.tgz", 728 | "integrity": "sha512-DyZyLJlMXM3CGdVaVHE/EDzCagMRoPI3mmGdxxNQbqkGqh56+M3d1i0ZAWd69En8U21DHbPTn12aOdhO+hfm5w==" 729 | }, 730 | "vary": { 731 | "version": "1.1.2", 732 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 733 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 734 | }, 735 | "wkx": { 736 | "version": "0.4.6", 737 | "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.4.6.tgz", 738 | "integrity": "sha512-LHxXlzRCYQXA9ZHgs8r7Gafh0gVOE8o3QmudM1PIkOdkXXjW7Thcl+gb2P2dRuKgW8cqkitCRZkkjtmWzpHi7A==", 739 | "requires": { 740 | "@types/node": "*" 741 | } 742 | }, 743 | "yallist": { 744 | "version": "2.1.2", 745 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 746 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" 747 | } 748 | } 749 | } 750 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "express-jwt-sequelize-mysql", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [ 10 | "Nodejs", 11 | "Express", 12 | "JWT", 13 | "Sequelize", 14 | "MySql", 15 | "Authentication" 16 | ], 17 | "author": "", 18 | "license": "ISC", 19 | "dependencies": { 20 | "body-parser": "^1.18.3", 21 | "express": "^4.16.4", 22 | "jsonwebtoken": "^8.4.0", 23 | "lodash": "^4.17.11", 24 | "mysql2": "^1.6.4", 25 | "passport": "^0.4.0", 26 | "passport-jwt": "^4.0.0", 27 | "sequelize": "^4.42.0" 28 | } 29 | } 30 | --------------------------------------------------------------------------------