├── README.md ├── image.png ├── index.js ├── package-lock.json ├── package.json └── sub.jpg /README.md: -------------------------------------------------------------------------------- 1 | # JWT Authorization and Token Refresh - Angular Academy 2 | 3 | Node.js part of video lesson: 4 | 5 | [JWT Authorization and Token Refresh](https://www.youtube.com/watch?v=F1GUjHPpCLA) 6 | 7 |

8 | 9 | [](https://www.youtube.com/watch?v=F1GUjHPpCLA) 10 | 11 | [](https://www.youtube.com/channel/UCcJutJNPZVG5sbp_xaTmKEw?sub_confirmation=1) 12 | 13 |

14 | -------------------------------------------------------------------------------- /image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartosz-io/jwt-auth-node/8e8885e4204853766c4031456e4c6d100d916703/image.png -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const bodyParser = require('body-parser'); 2 | const jwt = require('jsonwebtoken'); 3 | const randtoken = require('rand-token'); 4 | const passport = require('passport'); 5 | const JwtStrategy = require('passport-jwt').Strategy; 6 | const ExtractJwt = require('passport-jwt').ExtractJwt; 7 | const cors = require('cors'); 8 | const express = require('express'); 9 | const app = express(); 10 | 11 | const refreshTokens = {}; 12 | const SECRET = 'VERY_SECRET_KEY!'; 13 | const passportOpts = { 14 | jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), 15 | secretOrKey: SECRET 16 | }; 17 | 18 | app.use(bodyParser.json()); 19 | app.use(bodyParser.urlencoded({ extended: true })); 20 | app.use(passport.initialize()); 21 | app.use(passport.session()); 22 | app.use(cors()); 23 | 24 | passport.use(new JwtStrategy(passportOpts, function (jwtPayload, done) { 25 | const expirationDate = new Date(jwtPayload.exp * 1000); 26 | if(expirationDate < new Date()) { 27 | return done(null, false); 28 | } 29 | done(null, jwtPayload); 30 | })) 31 | 32 | passport.serializeUser(function (user, done) { 33 | done(null, user.username) 34 | }); 35 | 36 | app.post('/login', function (req, res) { 37 | const {username, password} = req.body; 38 | const user = { 39 | 'username': username, 40 | 'role': 'admin' 41 | }; 42 | const token = jwt.sign(user, SECRET, { expiresIn: 600 }) 43 | const refreshToken = randtoken.uid(256); 44 | refreshTokens[refreshToken] = username; 45 | res.json({jwt: token, refreshToken: refreshToken}); 46 | }); 47 | 48 | app.post('/logout', function (req, res) { 49 | const refreshToken = req.body.refreshToken; 50 | if (refreshToken in refreshTokens) { 51 | delete refreshTokens[refreshToken]; 52 | } 53 | res.sendStatus(204); 54 | }); 55 | 56 | app.post('/refresh', function (req, res) { 57 | const refreshToken = req.body.refreshToken; 58 | 59 | 60 | if (refreshToken in refreshTokens) { 61 | const user = { 62 | 'username': refreshTokens[refreshToken], 63 | 'role': 'admin' 64 | } 65 | const token = jwt.sign(user, SECRET, { expiresIn: 600 }); 66 | res.json({jwt: token}) 67 | } 68 | else { 69 | res.sendStatus(401); 70 | } 71 | }); 72 | 73 | app.get('/random', passport.authenticate('jwt'), function (req, res) { 74 | res.json({value: Math.floor(Math.random()*100) }); 75 | }) 76 | 77 | app.listen(8080); -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jwt-auth-server", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.5", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 10 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 11 | "requires": { 12 | "mime-types": "~2.1.18", 13 | "negotiator": "0.6.1" 14 | } 15 | }, 16 | "array-flatten": { 17 | "version": "1.1.1", 18 | "resolved": "http://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 19 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 20 | }, 21 | "body-parser": { 22 | "version": "1.18.3", 23 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 24 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 25 | "requires": { 26 | "bytes": "3.0.0", 27 | "content-type": "~1.0.4", 28 | "debug": "2.6.9", 29 | "depd": "~1.1.2", 30 | "http-errors": "~1.6.3", 31 | "iconv-lite": "0.4.23", 32 | "on-finished": "~2.3.0", 33 | "qs": "6.5.2", 34 | "raw-body": "2.3.3", 35 | "type-is": "~1.6.16" 36 | } 37 | }, 38 | "buffer-equal-constant-time": { 39 | "version": "1.0.1", 40 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 41 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 42 | }, 43 | "bytes": { 44 | "version": "3.0.0", 45 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 46 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 47 | }, 48 | "content-disposition": { 49 | "version": "0.5.2", 50 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 51 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 52 | }, 53 | "content-type": { 54 | "version": "1.0.4", 55 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 56 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 57 | }, 58 | "cookie": { 59 | "version": "0.3.1", 60 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 61 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 62 | }, 63 | "cookie-signature": { 64 | "version": "1.0.6", 65 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 66 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 67 | }, 68 | "cors": { 69 | "version": "2.8.5", 70 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 71 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 72 | "requires": { 73 | "object-assign": "^4", 74 | "vary": "^1" 75 | } 76 | }, 77 | "debug": { 78 | "version": "2.6.9", 79 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 80 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 81 | "requires": { 82 | "ms": "2.0.0" 83 | } 84 | }, 85 | "depd": { 86 | "version": "1.1.2", 87 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 88 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 89 | }, 90 | "destroy": { 91 | "version": "1.0.4", 92 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 93 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 94 | }, 95 | "ecdsa-sig-formatter": { 96 | "version": "1.0.10", 97 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz", 98 | "integrity": "sha1-HFlQAPBKiJffuFAAiSoPTDOvhsM=", 99 | "requires": { 100 | "safe-buffer": "^5.0.1" 101 | } 102 | }, 103 | "ee-first": { 104 | "version": "1.1.1", 105 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 106 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 107 | }, 108 | "encodeurl": { 109 | "version": "1.0.2", 110 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 111 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 112 | }, 113 | "escape-html": { 114 | "version": "1.0.3", 115 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 116 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 117 | }, 118 | "etag": { 119 | "version": "1.8.1", 120 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 121 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 122 | }, 123 | "express": { 124 | "version": "4.16.4", 125 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 126 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 127 | "requires": { 128 | "accepts": "~1.3.5", 129 | "array-flatten": "1.1.1", 130 | "body-parser": "1.18.3", 131 | "content-disposition": "0.5.2", 132 | "content-type": "~1.0.4", 133 | "cookie": "0.3.1", 134 | "cookie-signature": "1.0.6", 135 | "debug": "2.6.9", 136 | "depd": "~1.1.2", 137 | "encodeurl": "~1.0.2", 138 | "escape-html": "~1.0.3", 139 | "etag": "~1.8.1", 140 | "finalhandler": "1.1.1", 141 | "fresh": "0.5.2", 142 | "merge-descriptors": "1.0.1", 143 | "methods": "~1.1.2", 144 | "on-finished": "~2.3.0", 145 | "parseurl": "~1.3.2", 146 | "path-to-regexp": "0.1.7", 147 | "proxy-addr": "~2.0.4", 148 | "qs": "6.5.2", 149 | "range-parser": "~1.2.0", 150 | "safe-buffer": "5.1.2", 151 | "send": "0.16.2", 152 | "serve-static": "1.13.2", 153 | "setprototypeof": "1.1.0", 154 | "statuses": "~1.4.0", 155 | "type-is": "~1.6.16", 156 | "utils-merge": "1.0.1", 157 | "vary": "~1.1.2" 158 | } 159 | }, 160 | "finalhandler": { 161 | "version": "1.1.1", 162 | "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 163 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 164 | "requires": { 165 | "debug": "2.6.9", 166 | "encodeurl": "~1.0.2", 167 | "escape-html": "~1.0.3", 168 | "on-finished": "~2.3.0", 169 | "parseurl": "~1.3.2", 170 | "statuses": "~1.4.0", 171 | "unpipe": "~1.0.0" 172 | } 173 | }, 174 | "forwarded": { 175 | "version": "0.1.2", 176 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 177 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 178 | }, 179 | "fresh": { 180 | "version": "0.5.2", 181 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 182 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 183 | }, 184 | "http-errors": { 185 | "version": "1.6.3", 186 | "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 187 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 188 | "requires": { 189 | "depd": "~1.1.2", 190 | "inherits": "2.0.3", 191 | "setprototypeof": "1.1.0", 192 | "statuses": ">= 1.4.0 < 2" 193 | } 194 | }, 195 | "iconv-lite": { 196 | "version": "0.4.23", 197 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 198 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 199 | "requires": { 200 | "safer-buffer": ">= 2.1.2 < 3" 201 | } 202 | }, 203 | "inherits": { 204 | "version": "2.0.3", 205 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 206 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 207 | }, 208 | "ipaddr.js": { 209 | "version": "1.8.0", 210 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 211 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" 212 | }, 213 | "jsonwebtoken": { 214 | "version": "8.4.0", 215 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.4.0.tgz", 216 | "integrity": "sha512-coyXjRTCy0pw5WYBpMvWOMN+Kjaik2MwTUIq9cna/W7NpO9E+iYbumZONAz3hcr+tXFJECoQVrtmIoC3Oz0gvg==", 217 | "requires": { 218 | "jws": "^3.1.5", 219 | "lodash.includes": "^4.3.0", 220 | "lodash.isboolean": "^3.0.3", 221 | "lodash.isinteger": "^4.0.4", 222 | "lodash.isnumber": "^3.0.3", 223 | "lodash.isplainobject": "^4.0.6", 224 | "lodash.isstring": "^4.0.1", 225 | "lodash.once": "^4.0.0", 226 | "ms": "^2.1.1" 227 | }, 228 | "dependencies": { 229 | "ms": { 230 | "version": "2.1.1", 231 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 232 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 233 | } 234 | } 235 | }, 236 | "jwa": { 237 | "version": "1.1.6", 238 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.6.tgz", 239 | "integrity": "sha512-tBO/cf++BUsJkYql/kBbJroKOgHWEigTKBAjjBEmrMGYd1QMBC74Hr4Wo2zCZw6ZrVhlJPvoMrkcOnlWR/DJfw==", 240 | "requires": { 241 | "buffer-equal-constant-time": "1.0.1", 242 | "ecdsa-sig-formatter": "1.0.10", 243 | "safe-buffer": "^5.0.1" 244 | } 245 | }, 246 | "jws": { 247 | "version": "3.1.5", 248 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.5.tgz", 249 | "integrity": "sha512-GsCSexFADNQUr8T5HPJvayTjvPIfoyJPtLQBwn5a4WZQchcrPMPMAWcC1AzJVRDKyD6ZPROPAxgv6rfHViO4uQ==", 250 | "requires": { 251 | "jwa": "^1.1.5", 252 | "safe-buffer": "^5.0.1" 253 | } 254 | }, 255 | "lodash.includes": { 256 | "version": "4.3.0", 257 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 258 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" 259 | }, 260 | "lodash.isboolean": { 261 | "version": "3.0.3", 262 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 263 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" 264 | }, 265 | "lodash.isinteger": { 266 | "version": "4.0.4", 267 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 268 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" 269 | }, 270 | "lodash.isnumber": { 271 | "version": "3.0.3", 272 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 273 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" 274 | }, 275 | "lodash.isplainobject": { 276 | "version": "4.0.6", 277 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 278 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 279 | }, 280 | "lodash.isstring": { 281 | "version": "4.0.1", 282 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 283 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 284 | }, 285 | "lodash.once": { 286 | "version": "4.1.1", 287 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 288 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" 289 | }, 290 | "media-typer": { 291 | "version": "0.3.0", 292 | "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 293 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 294 | }, 295 | "merge-descriptors": { 296 | "version": "1.0.1", 297 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 298 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 299 | }, 300 | "methods": { 301 | "version": "1.1.2", 302 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 303 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 304 | }, 305 | "mime": { 306 | "version": "1.4.1", 307 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 308 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 309 | }, 310 | "mime-db": { 311 | "version": "1.37.0", 312 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 313 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" 314 | }, 315 | "mime-types": { 316 | "version": "2.1.21", 317 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 318 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 319 | "requires": { 320 | "mime-db": "~1.37.0" 321 | } 322 | }, 323 | "ms": { 324 | "version": "2.0.0", 325 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 326 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 327 | }, 328 | "negotiator": { 329 | "version": "0.6.1", 330 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 331 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 332 | }, 333 | "object-assign": { 334 | "version": "4.1.1", 335 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 336 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 337 | }, 338 | "on-finished": { 339 | "version": "2.3.0", 340 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 341 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 342 | "requires": { 343 | "ee-first": "1.1.1" 344 | } 345 | }, 346 | "parseurl": { 347 | "version": "1.3.2", 348 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 349 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 350 | }, 351 | "passport": { 352 | "version": "0.4.0", 353 | "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.0.tgz", 354 | "integrity": "sha1-xQlWkTR71a07XhgCOMORTRbwWBE=", 355 | "requires": { 356 | "passport-strategy": "1.x.x", 357 | "pause": "0.0.1" 358 | } 359 | }, 360 | "passport-jwt": { 361 | "version": "4.0.0", 362 | "resolved": "http://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.0.tgz", 363 | "integrity": "sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg==", 364 | "requires": { 365 | "jsonwebtoken": "^8.2.0", 366 | "passport-strategy": "^1.0.0" 367 | } 368 | }, 369 | "passport-strategy": { 370 | "version": "1.0.0", 371 | "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", 372 | "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" 373 | }, 374 | "path-to-regexp": { 375 | "version": "0.1.7", 376 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 377 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 378 | }, 379 | "pause": { 380 | "version": "0.0.1", 381 | "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", 382 | "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" 383 | }, 384 | "proxy-addr": { 385 | "version": "2.0.4", 386 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", 387 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", 388 | "requires": { 389 | "forwarded": "~0.1.2", 390 | "ipaddr.js": "1.8.0" 391 | } 392 | }, 393 | "qs": { 394 | "version": "6.5.2", 395 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 396 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 397 | }, 398 | "rand-token": { 399 | "version": "0.4.0", 400 | "resolved": "https://registry.npmjs.org/rand-token/-/rand-token-0.4.0.tgz", 401 | "integrity": "sha512-FLNNsir2R+XY8LKsZ+8u/w0qZ4sGit7cpNdznsI77cAVob6UlVPueDKRyjJ3W1Q6FJLgAVH98JvlqqpSaL7NEQ==" 402 | }, 403 | "range-parser": { 404 | "version": "1.2.0", 405 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 406 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 407 | }, 408 | "raw-body": { 409 | "version": "2.3.3", 410 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 411 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 412 | "requires": { 413 | "bytes": "3.0.0", 414 | "http-errors": "1.6.3", 415 | "iconv-lite": "0.4.23", 416 | "unpipe": "1.0.0" 417 | } 418 | }, 419 | "safe-buffer": { 420 | "version": "5.1.2", 421 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 422 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 423 | }, 424 | "safer-buffer": { 425 | "version": "2.1.2", 426 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 427 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 428 | }, 429 | "send": { 430 | "version": "0.16.2", 431 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 432 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 433 | "requires": { 434 | "debug": "2.6.9", 435 | "depd": "~1.1.2", 436 | "destroy": "~1.0.4", 437 | "encodeurl": "~1.0.2", 438 | "escape-html": "~1.0.3", 439 | "etag": "~1.8.1", 440 | "fresh": "0.5.2", 441 | "http-errors": "~1.6.2", 442 | "mime": "1.4.1", 443 | "ms": "2.0.0", 444 | "on-finished": "~2.3.0", 445 | "range-parser": "~1.2.0", 446 | "statuses": "~1.4.0" 447 | } 448 | }, 449 | "serve-static": { 450 | "version": "1.13.2", 451 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 452 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 453 | "requires": { 454 | "encodeurl": "~1.0.2", 455 | "escape-html": "~1.0.3", 456 | "parseurl": "~1.3.2", 457 | "send": "0.16.2" 458 | } 459 | }, 460 | "setprototypeof": { 461 | "version": "1.1.0", 462 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 463 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 464 | }, 465 | "statuses": { 466 | "version": "1.4.0", 467 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 468 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 469 | }, 470 | "type-is": { 471 | "version": "1.6.16", 472 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 473 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 474 | "requires": { 475 | "media-typer": "0.3.0", 476 | "mime-types": "~2.1.18" 477 | } 478 | }, 479 | "unpipe": { 480 | "version": "1.0.0", 481 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 482 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 483 | }, 484 | "utils-merge": { 485 | "version": "1.0.1", 486 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 487 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 488 | }, 489 | "vary": { 490 | "version": "1.1.2", 491 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 492 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 493 | } 494 | } 495 | } 496 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jwt-auth-server", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "body-parser": "^1.18.3", 13 | "cors": "^2.8.5", 14 | "express": "^4.16.4", 15 | "jsonwebtoken": "^8.4.0", 16 | "passport": "^0.4.0", 17 | "passport-jwt": "^4.0.0", 18 | "rand-token": "^0.4.0" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /sub.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartosz-io/jwt-auth-node/8e8885e4204853766c4031456e4c6d100d916703/sub.jpg --------------------------------------------------------------------------------