feat: add Oauth authentication

This commit is contained in:
2023-01-09 23:44:01 +01:00
parent 4e417266c4
commit 3d149e0d1c
5 changed files with 139 additions and 4 deletions
+52
View File
@@ -0,0 +1,52 @@
import { Router } from 'express';
import { AuthorizationCode } from 'simple-oauth2'
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);
return res.status(200).json(accessToken.token);
} catch (error) {
console.error('Access Token Error', error.message);
return res.status(500).redirect(`/error?message=${encodeURIComponent('Autenticazione fallita')}`);
}
});
}
+9 -3
View File
@@ -38,6 +38,7 @@ import {
import { initialDatabaseValue } from './db/example-data'
import { validateObjectKeys } from '../shared/utils'
import { setupOauth } from './auth'
export async function createApiRouter() {
type SessionId = Opaque<string, string, 'session'>
@@ -70,6 +71,11 @@ export async function createApiRouter() {
r.use(bodyParser.json())
r.use(cookieParser())
const authRouter: Router = express.Router()
setupOauth(authRouter)
r.use('/auth', authRouter)
r.get('/api/status', (req, res) => {
res.json({ url: req.originalUrl, status: 'ok' })
})
@@ -243,7 +249,7 @@ export async function createApiRouter() {
let queryUser = (req.query.user ?? null) as UserId | null
let queryProblem = (req.query.problem ?? null) as ProblemId | null
let isPublic = (req.query.public === '')
const requestUser = await getRequestUser(req)
let solutions = await getSolutions(db)
@@ -256,10 +262,10 @@ export async function createApiRouter() {
solutions = solutions.filter(s => s.sentBy === queryUser)
}
if(isPublic) {
if (isPublic) {
solutions = solutions.filter(s => s.visible)
}
// filtra rispetto ai problemi
if (queryProblem !== null) {
solutions = solutions.filter(s => s.forProblem === queryProblem)