You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 lines
1.9 KiB
TypeScript

import { Router } from 'express';
import { AuthorizationCode } from 'simple-oauth2'
import fetch from 'node-fetch'
export function setupOauth(r: Router) {
const config = {
client: {
id: process.env.OAUTH_CLIENT_ID ?? '',
secret: process.env.OAUTH_CLIENT_SECRET ?? '',
},
auth: {
authorizePath: process.env.OAUTH_AUTH_URL ?? '',
tokenHost: process.env.OAUTH_TOKEN_HOST ?? '',
tokenPath: process.env.OAUTH_TOKEN_PATH ?? ''
},
};
const conf = {
redirect_uri: process.env.OAUTH_REDIRECT_URL ?? '',
scope: process.env.OAUTH_SCOPES ?? '',
}
const client = new AuthorizationCode(config);
const authorizationUri = client.authorizeURL({
redirect_uri: conf.redirect_uri,
scope: conf.scope,
state: ''
});
r.get('/redirect', (req, res) => {
res.redirect(authorizationUri);
});
// Callback service parsing the authorization token and asking for the access token
r.get('/callback', async (req, res) => {
const code = req.query.code as string;
const options = {
code,
redirect_uri: conf.redirect_uri
};
try {
const accessToken = await client.getToken(options);
console.log(accessToken.token.access_token)
const userInfo = await (await fetch(process.env.OAUTH_USER_INFO_URL ?? '', {
method: 'GET',
headers: {
'Authorization': "Bearer " + accessToken.token.access_token
}
})).json()
// TODO: call to db && login
return res.status(200).json(userInfo);
} catch (error) {
console.error('Access Token Error', error.message);
return res.status(500).redirect(`/error?message=${encodeURIComponent('Autenticazione fallita')}`);
}
});
}