Skip to content

Commit 9741f5e

Browse files
committed
Angular Security course
1 parent e8cbf26 commit 9741f5e

11 files changed

+40
-100
lines changed

demos/jwt-check-hs256.js

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ var jwt = require('jsonwebtoken');
33

44

55
// verify an existing JWT
6-
var existingToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6InRlc3RAbWFpbGluYXRvci5jb20iLCJpYXQiOjE1MDI4ODAzNTJ9.uXXUBgipNmjvb4UvEnQ0LOdO8aKxne9Wg01jcoj3YWE';
6+
var existingToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhbGdvcml0aG0iOiJIUzI1NiIsImRhdGEiOnsidXNlcklkIjoxfSwiaWF0IjoxNTAyODgxOTIxfQ.6ayBjYiaTMJ8Z3tYx6VfueFLDN1U8SFl94B7U3ZWO6Q';
77

88

99
var secretKey = 'secret-key';
@@ -18,10 +18,4 @@ console.log("Decoded JWT:", verify);
1818

1919

2020

21-
//const wrong = jwt.verify(existingToken, 'wrong-secret');
22-
23-
//console.log(":", wrong);
24-
25-
26-
2721

demos/jwt-hs256.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,15 @@ var jwt = require('jsonwebtoken');
66
var secretKey = 'secret-key';
77

88
var payload = {
9-
email: 'test@mailinator.com'
9+
userId: 1
1010
};
1111

1212

1313
// create a JWT
14-
var newToken = jwt.sign(payload, secretKey, {algorithm: 'HS256' });
14+
var newToken = jwt.sign({
15+
algorithm: 'HS256',
16+
data: payload
17+
}, secretKey);
1518

1619
console.log("JWT created:", newToken);
1720

demos/jwt-rs256.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@ var fs = require('fs');
66
var privateKey = fs.readFileSync('./demos/private.key');
77

88
var payload = {
9-
email: 'test@mailinator.com'
9+
userId: 1
1010
};
1111

1212

13-
var token = jwt.sign(payload, privateKey, {algorithm: 'RS256' });
13+
var token = jwt.sign({
14+
algorithm: 'RS256',
15+
data: payload
16+
}, privateKey);
1417

1518

1619
console.log('RSA 256 JWT', token);

server/create-user.route.ts

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11

22
import {Request, Response} from "express";
33
import {db} from "./database";
4-
import {USERS} from "./database-data";
54
import * as argon2 from 'argon2';
65
import {validatePassword} from "./password-validation";
7-
import {randomBytes} from "./security.utils";
8-
import {sessionStore} from "./session-store";
6+
import moment = require("moment");
7+
import {createSessionToken} from "./security.utils";
8+
99

1010

1111

@@ -32,13 +32,9 @@ async function createUserAndSession(res:Response, credentials) {
3232

3333
const user = db.createUser(credentials.email, passwordDigest);
3434

35-
const sessionId = await randomBytes(32).then(bytes => bytes.toString('hex'));
36-
37-
console.log("sessionId",sessionId );
35+
const sessionToken = await createSessionToken(user.id);
3836

39-
sessionStore.createSession(sessionId, user);
40-
41-
res.cookie("SESSIONID", sessionId, {httpOnly:true, secure:true});
37+
res.cookie("SESSIONID", sessionToken, {httpOnly:true, secure:true});
4238

4339
res.status(200).json({id:user.id, email:user.email});
4440
}
@@ -47,6 +43,6 @@ async function createUserAndSession(res:Response, credentials) {
4743

4844

4945

50-
46+
// eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhbGdvcml0aG0iOiJSUzI1NiIsImV4cCI6MTUwMjg4NTI4My4wMzEsInN1YmplY3QiOjEsImlhdCI6MTUwMjg4NTE2M30.BfdcIp8RY97W0Fzznbx0efQdWT2_YropraA5ofKUXPQ
5147

5248

server/get-user.route.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11

22

33
import {Request, Response} from "express";
4-
import {sessionStore} from "./session-store";
54

65

76

87
export function getUser(req:Request, res:Response) {
98

109
const sessionId = req.cookies['SESSIONID'];
1110

12-
const user = sessionStore.findUserBySessionId(sessionId);
11+
//TODO
12+
const user = {};
1313

1414

1515
if (user) {

server/login.route.ts

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ import {db} from "./database";
55
import * as argon2 from 'argon2';
66
import {User} from "../src/app/model/user";
77
import {DbUser} from "./db-user";
8-
import {randomBytes} from "./security.utils";
9-
import {sessionStore} from "./session-store";
8+
import {createSessionToken, randomBytes} from "./security.utils";
109

1110

1211

@@ -29,11 +28,11 @@ async function loginAndBuildResponse(credentials:any, user:DbUser, res: Respons
2928

3029
try {
3130

32-
const sessionId = await attemptLogin(credentials, user);
31+
const sessionToken = await attemptLogin(credentials, user);
3332

3433
console.log("Login successful");
3534

36-
res.cookie("SESSIONID", sessionId, {httpOnly:true, secure:true});
35+
res.cookie("SESSIONID", sessionToken, {httpOnly:true, secure:true});
3736

3837
res.status(200).json({id:user.id, email:user.email});
3938

@@ -58,13 +57,7 @@ async function attemptLogin(credentials:any, user:DbUser) {
5857
throw new Error("Password Invalid");
5958
}
6059

61-
const sessionId = await randomBytes(32).then(bytes => bytes.toString('hex'));
62-
63-
console.log("sessionId",sessionId );
64-
65-
sessionStore.createSession(sessionId, user);
66-
67-
return sessionId;
60+
return createSessionToken(user.id);
6861
}
6962

7063

server/logout.route.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11

22

33
import {Request, Response} from 'express';
4-
import {sessionStore} from "./session-store";
54

65

76

87
export function logout(req: Request, res: Response) {
98

109
const sessionId = req.cookies['SESSIONID'];
1110

12-
sessionStore.destroySession(sessionId);
13-
1411
res.clearCookie("SESSIONID");
1512

1613
res.sendStatus(200);

server/read-all-lessons.route.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11

22
import {db} from "./database";
3-
import {sessionStore} from "./session-store";
43

54

65
export function readAllLessons(req, res) {
76

87
const sessionId = req.cookies["SESSIONID"];
98

10-
const isSessionValid = sessionStore.isSessionValid(sessionId);
9+
//TODO
10+
const isSessionValid = true;
1111

1212
if (!isSessionValid) {
1313
res.sendStatus(403);

server/security.utils.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,25 @@
11

22

33

4+
import moment = require("moment");
45
const util = require('util');
56
const crypto = require('crypto');
7+
import * as jwt from 'jsonwebtoken';
8+
import * as fs from "fs";
69

710

11+
12+
const RSA_PRIVATE_KEY = fs.readFileSync('./demos/private.key');
13+
814
export const randomBytes = util.promisify(crypto.randomBytes);
915

1016

17+
18+
export async function createSessionToken(userId:number) {
19+
return jwt.sign(
20+
{
21+
algorithm: 'RS256',
22+
exp: (moment().add(2,"minutes").toDate().getTime() / 1000),
23+
subject: userId
24+
}, RSA_PRIVATE_KEY);
25+
}

server/session-store.ts

Lines changed: 0 additions & 34 deletions
This file was deleted.

server/session.ts

Lines changed: 0 additions & 27 deletions
This file was deleted.

0 commit comments

Comments
 (0)