Skip to content

Commit 9df5b7c

Browse files
committed
Angular Security course
1 parent c4f8183 commit 9df5b7c

9 files changed

+34
-19
lines changed

server/create-user.route.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@ export function createUser(req: Request, res:Response) {
2121
else {
2222

2323
createUserAndSession(res, credentials)
24-
.catch(() => {res.sendStatus(500)});
24+
.catch((err) => {
25+
console.log("Error creating new user", err);
26+
res.sendStatus(500);
27+
});
2528

2629
}
2730

@@ -33,7 +36,7 @@ async function createUserAndSession(res:Response, credentials) {
3336

3437
const user = db.createUser(credentials.email, passwordDigest);
3538

36-
const sessionToken = await createSessionToken(user.id.toString());
39+
const sessionToken = await createSessionToken(user);
3740

3841
const csrfToken = await createCsrfToken();
3942

server/database-data.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,18 @@ export const USERS: { [key: number]: DbUser } = {
55
id: 1,
66
email: 'admin@gmail.com',
77
// ADMIN user (password is Password10) can read all lessons and also can login on behalf of other users
8-
passwordDigest: '$argon2i$v=19$m=4096,t=3,p=1$PcKtsL4a6+xuPbMCKPep7A$rrFO2lKZcAVguIMaSGaf3hMrKtb6wUG4zN/wDG+xNts',
8+
passwordDigest: '$argon2i$v=19$m=4096,t=3,p=1$vfrhde0OMBNSSE9rRWtVrQ$gBaNgJFPBZfzuvrzfX8iSr2+OCD8K8Iu/JjwpYp8/TY',
99
roles: {
10-
'READ:LESSONS': true
10+
'STUDENT': true
1111
}
1212
},
1313
2: {
14-
id: 1,
14+
id: 2,
1515
email: 'user@gmail.com',
1616
// normal user (password is Password10), does not have access to login as another user functionality
17-
passwordDigest: '$argon2i$v=19$m=4096,t=3,p=1$PcKtsL4a6+xuPbMCKPep7A$rrFO2lKZcAVguIMaSGaf3hMrKtb6wUG4zN/wDG+xNts',
17+
passwordDigest: '$argon2i$v=19$m=4096,t=3,p=1$vfrhde0OMBNSSE9rRWtVrQ$gBaNgJFPBZfzuvrzfX8iSr2+OCD8K8Iu/JjwpYp8/TY',
1818
roles: {
19-
'READ:LESSONS': true,
19+
'STUDENT': true,
2020
'ADMIN': true
2121
}
2222
}

server/database.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {DbUser} from "./db-user";
66

77
class InMemoryDatabase {
88

9-
userCounter = 0;
9+
userCounter = 2;
1010

1111
readAllLessons() {
1212
return _.values(LESSONS);
@@ -30,7 +30,9 @@ class InMemoryDatabase {
3030
id,
3131
email,
3232
passwordDigest,
33-
roles: ["READ:LESSONS"]
33+
roles: {
34+
"STUDENT":true
35+
}
3436
};
3537

3638
USERS[id] = user;
@@ -43,9 +45,15 @@ class InMemoryDatabase {
4345

4446
findUserByEmail(email:string) :DbUser {
4547

48+
console.log("Finding user by email:", email);
49+
4650
const users = _.values(USERS);
4751

48-
return _.find(users, user => user.email === email);
52+
const user = _.find(users, user => user.email === email);
53+
54+
console.log("user retrieved:", user);
55+
56+
return user;
4957
}
5058

5159
findUserById(userId:string) :DbUser {

server/login.route.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ async function loginAndBuildResponse(credentials:any, user:DbUser, res: Respons
4242
}
4343
catch(err) {
4444

45-
console.log("Login failed!");
45+
console.log("Login failed:", err);
4646
res.sendStatus(403);
4747

4848
}

server/read-all-lessons.route.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ import {db} from "./database";
44

55
export function readAllLessons(req, res) {
66

7-
const userRoles = req["user"].roles;
7+
const user = req["user"];
88

9-
if (userRoles && userRoles['READ:LESSONS']) {
9+
if (user.isStudent) {
1010
res.status(200).json({lessons:db.readAllLessons()});
1111
}
1212
else {
13-
res.SendStatus(403);
13+
res.sendStatus(403);
1414
}
1515
}

server/security.utils.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,14 @@ const SESSION_DURATION = 1000;
2323

2424

2525
export async function createSessionToken(user: DbUser) {
26-
return signJwt({}, RSA_PRIVATE_KEY, {
26+
return signJwt({
27+
isAdmin: !!user.roles["ADMIN"],
28+
isStudent: !!user.roles["STUDENT"]
29+
},
30+
RSA_PRIVATE_KEY, {
2731
algorithm: 'RS256',
2832
expiresIn: 240,
29-
subject: user.id,
30-
roles: user.roles
33+
subject: user.id.toString()
3134
});
3235
}
3336

src/app/admin/admin.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export class AdminComponent {
2727

2828
const val = this.form.value;
2929

30-
if (val.email) {
30+
if (val.userEmail) {
3131
this.authService.loginAsUser(val.email)
3232
.subscribe(
3333
() => {

src/app/login/login.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export class LoginComponent implements OnInit {
2121
constructor(private fb:FormBuilder, private authService: AuthService, private router: Router) {
2222

2323
this.form = this.fb.group({
24-
email: ['user@gmail.com',Validators.required],
24+
email: ['test@gmail.com',Validators.required],
2525
password: ['Password10',Validators.required]
2626
});
2727

src/app/services/auth.service.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export class AuthService {
2424

2525
constructor(private http: HttpClient) {
2626
http.get<User>('/api/user')
27+
.do(console.log)
2728
.subscribe(user => this.subject.next(user ? user : ANONYMOUS_USER));
2829
}
2930

0 commit comments

Comments
 (0)