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')}`) } }) }