From 163dfe2a001f48a8c723a1566a88d9c8f43f608f Mon Sep 17 00:00:00 2001 From: Matthieu Petit Date: Wed, 15 May 2024 11:27:11 +0200 Subject: [PATCH] feat(auth): allow public access to `current-users` endpoint --- lib/auth.js | 19 ++++++++++++------- server.js | 20 ++++++++++---------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/lib/auth.js b/lib/auth.js index bbe8823..372f855 100644 --- a/lib/auth.js +++ b/lib/auth.js @@ -51,13 +51,15 @@ export function ensureToken(req, res, next) { } export async function ensureAccess(req, res, next) { - await retrieveUserFromAccessToken(req, res) + if (req.isAdmin) { + return next() + } if (!req.user) { throw createError(401, 'Authentication required') } - if (req.rawUser && !(req.rawUser._id === req.user.id || req.isAdmin)) { + if (req.rawUser && req.rawUser._id !== req.user.id) { throw createError(403, 'You are not allowed to access this content') } @@ -72,7 +74,7 @@ export function ensureAdmin(req, res, next) { return next() } -export function multiAuth(req, res, next) { +export async function multiAuth(req, res, next) { const tokenAuthentication = authToken(req) if (tokenAuthentication === true) { @@ -84,7 +86,9 @@ export function multiAuth(req, res, next) { throw createError(401, 'Invalid API key') } - return ensureAccess(req, res, next) + await retrieveUserFromAccessToken(req, res) + + return next() } const {OAUTH_FOLLOW_WHITELIST} = process.env @@ -230,11 +234,12 @@ export function buildOauth2Callback(path) { * Decode the access token and add the user to the request */ export async function retrieveUserFromAccessToken(req) { - if (!req.get('Authorization')) { - throw createError(401) + const authorizationHeader = req.get('Authorization') + if (!authorizationHeader) { + return } - const accessToken = req.get('Authorization').slice('Bearer '.length) + const accessToken = authorizationHeader.slice('Bearer '.length) const user = await verifyAccessToken(accessToken) .catch(error => { if (error instanceof jwt.TokenExpiredError) { diff --git a/server.js b/server.js index 490837e..b48b338 100644 --- a/server.js +++ b/server.js @@ -90,13 +90,13 @@ app.get('/coworkersNow', w(coworkersNow)) // Legacy /* General purpose */ app.get('/api/members', w(multiAuth), w(ensureAdmin), w(getAllMembers)) -app.get('/api/members/:userId', w(multiAuth), w(getMemberInfos)) -app.get('/api/members/:userId/activity', w(multiAuth), w(getMemberActivity)) -app.get('/api/members/:userId/tickets', w(multiAuth), w(getMemberTickets)) -app.get('/api/members/:userId/subscriptions', w(multiAuth), w(getMemberSubscriptions)) -app.get('/api/members/:userId/memberships', w(multiAuth), w(getMemberMemberships)) -app.put('/api/members/:userId/mac-addresses', express.json(), w(multiAuth), w(updateMemberMacAddresses)) -app.post('/api/members/:userId/sync-wordpress', w(multiAuth), w(forceWordpressSync)) +app.get('/api/members/:userId', w(multiAuth), w(ensureAccess), w(getMemberInfos)) +app.get('/api/members/:userId/activity', w(multiAuth), w(ensureAccess), w(getMemberActivity)) +app.get('/api/members/:userId/tickets', w(multiAuth), w(ensureAccess), w(getMemberTickets)) +app.get('/api/members/:userId/subscriptions', w(multiAuth), w(ensureAccess), w(getMemberSubscriptions)) +app.get('/api/members/:userId/memberships', w(multiAuth), w(ensureAccess), w(getMemberMemberships)) +app.put('/api/members/:userId/mac-addresses', express.json(), w(multiAuth), w(ensureAccess), w(updateMemberMacAddresses)) +app.post('/api/members/:userId/sync-wordpress', w(multiAuth), w(ensureAccess), w(forceWordpressSync)) app.get('/api/voting-members', w(multiAuth), w(ensureAdmin), w(getVotingMembers)) app.get('/api/users-stats', w(multiAuth), w(ensureAdmin), w(getUsersStats)) @@ -115,7 +115,7 @@ app.post('/api/sync-user-webhook', validateAndParseJson, w(syncUserWebhook)) /* Services */ -app.post('/api/interphone', w(multiAuth), w(async (req, res) => { +app.post('/api/interphone', w(multiAuth), w(ensureAccess), w(async (req, res) => { if (!req.isAdmin && !req.user?.capabilities.includes('UNLOCK_GATE')) { throw createHttpError(403, 'Forbidden') } @@ -132,7 +132,7 @@ app.post('/api/interphone', w(multiAuth), w(async (req, res) => { }) })) -app.post('/api/parking', w(multiAuth), w(async (req, res) => { +app.post('/api/parking', w(multiAuth), w(ensureAccess), w(async (req, res) => { if (!req.isAdmin && !req.user?.capabilities.includes('PARKING_ACCESS')) { throw createHttpError(403, 'Forbidden') } @@ -154,7 +154,7 @@ app.get('/netatmo/stations', w(async (req, res) => { res.send(sensors) })) -app.use('/api/on-premise', w(ensureAccess), onPremiseRoutes) +app.use('/api/on-premise', w(multiAuth), w(ensureAccess), onPremiseRoutes) app.get('/api/calendar/events', w(multiAuth), w(getAllEvents))