This repository has been archived by the owner on Apr 15, 2024. It is now read-only.
/
auth-oob.route.ts
101 lines (95 loc) · 2.39 KB
/
auth-oob.route.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import {OobService} from '../services/oob.service';
import {AuthService} from '../services/auth.service';
export class AuthOobRoute {
endpoint = '/auth/oob';
disabled = ['get', 'post', 'put'];
constructor(
private oobService: OobService,
private authService: AuthService
) {}
/**
* Check an oob code
*/
get(req: {
query: {
oobCode: string;
mode: string;
};
}) {
const {oobCode, mode} = req.query;
if (oobCode) {
const user = this.authService.getUserByOobCode(oobCode);
const {email, oobMode} = user.getData();
if (!!mode && !!oobMode && mode === oobMode) {
const operations = {
resetPassword: 'PASSWORD_RESET',
verifyEmail: 'VERIFY_EMAIL',
} as Record<string, string>;
return {
operation: operations[oobMode] || 'NONE',
data: {email},
};
}
}
throw new Error('auth/invalid-input');
}
/**
* Handle oob actions
*/
post(req: {
body: {
oobCode: string;
mode: string;
newPassword?: string;
};
}) {
const {mode, oobCode, newPassword = ''} = req.body;
if (!!mode && !!oobCode) {
const user = this.authService.getUserByOobCode(oobCode);
const {oobMode} = user.getData();
if (mode === oobMode) {
// reset password
if (mode === 'resetPassword') {
if (this.authService.isValidPassword(newPassword)) {
// validate password
user
.setPassword(newPassword)
.setRefreshToken() // revoke current access
.setOob() // revoke oob code
.save();
}
}
// verify email
else if (mode === 'verifyEmail') {
user.confirmEmail().save();
}
}
}
throw new Error('auth/invalid-input');
}
/**
* Send oob emails
*/
put(req: {
body: {
mode: string;
email: string;
};
}) {
const {mode, email} = req.body;
if (!!mode && !!email) {
const user = this.authService.getUser({email});
if (user) {
if (mode === 'resetPassword') {
this.oobService.sendPasswordResetEmail(
user.setOob(mode).save().getData()
);
} else if (mode === 'verifyEmail') {
this.oobService.sendEmailVerificationEmail(
user.setOob(mode).save().getData()
);
}
}
}
}
}