feat: add Oauth authentication
This commit is contained in:
@@ -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
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user