-
Notifications
You must be signed in to change notification settings - Fork 322
/
Copy pathlogin.ts
48 lines (42 loc) · 1.23 KB
/
login.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
import { authenticate, isCallbackUrlValid } from '../../../src/serverless/nus-auth';
import {
createRouteHandler,
defaultFallback,
defaultRescue,
Handler,
MethodHandlers,
} from '../../../src/serverless/handler';
const errors = {
noRelayState: 'ERR_NO_RELAY_STATE',
invalidRelayState: 'ERR_INVALID_RELAY_STATE',
};
const handlePost: Handler = async (req, res) => {
try {
const { token, relayState } = await authenticate(req);
if (!relayState) {
throw new Error(errors.noRelayState);
}
if (!isCallbackUrlValid(relayState)) {
throw new Error(errors.invalidRelayState);
}
const userURL = new URL(relayState);
userURL.searchParams.append('token', token);
res.redirect(301, userURL.toString());
} catch (err) {
if (err.message === errors.noRelayState) {
res.json({
message: 'Relay state not found in request',
});
} else if (err.message === errors.invalidRelayState) {
res.json({
message: 'Invalid relay state given. URL must be from a valid domain.',
});
} else {
throw err;
}
}
};
const methodHandlers: MethodHandlers = {
POST: handlePost,
};
export default createRouteHandler(methodHandlers, defaultFallback, defaultRescue(true));