-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcallback.js
57 lines (48 loc) · 1.87 KB
/
callback.js
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
const express = require('express');
const { fusionAuthClient, getFormURLEncodedPayload } = require('../fusionAuthClient.js');
const config = require('../config.js');
const cookie = require('../cookie.js');
const redirectState = require('../redirectState.js');
const router = express.Router();
router.get('/', async (req, res) => {
console.log("accepting request for token exchange");
const code = req.query.code;
const codeVerifier = req.cookies.codeVerifier;
const redirect_uri = `${req.protocol}://${req.get('host')}/app/callback`;
try {
// POST request to /oauth2/token endpoint
const fusionAuthResponse = await fusionAuthClient('/oauth2/token', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: getFormURLEncodedPayload({
'client_id': config.clientId,
'client_secret': config.clientSecret,
'code': code,
'code_verifier': codeVerifier,
'grant_type': 'authorization_code',
'redirect_uri': redirect_uri,
})
})
const { access_token, id_token, refresh_token, expires_in } = fusionAuthResponse;
if (!(access_token && refresh_token)) {
console.log("Either refresh token or access token is missing.");
res.sendStatus(503)
return
}
console.log("saving tokens as cookies");
// save tokens as cookies
cookie.setSecure(res, 'app.at', access_token);
cookie.setSecure(res, 'app.rt', refresh_token);
const expires_in_ms = expires_in * 1000;
cookie.setReadable(res, 'app.at_exp', (Date.now() + expires_in_ms) / 1000);
cookie.setReadable(res, 'codeVerifier', '', 0);
cookie.setReadable(res, "app.idt", id_token);
const redirectUrl = redirectState.generateRedirectUrlFromState(req);
res.redirect(redirectUrl);
} catch (error) {
res.status(500).send(error)
}
});
module.exports = router;