├── 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
--------------------------------------------------------------------------------