Begin service account middleware

This commit is contained in:
Tuan Dang
2023-03-30 23:55:24 +07:00
parent 54e099f8a8
commit 9c18adf35f
31 changed files with 279 additions and 146 deletions
+12 -2
View File
@@ -4,7 +4,8 @@ import {
validateAuthMode,
getAuthUserPayload,
getAuthSTDPayload,
getAuthAPIKeyPayload
getAuthAPIKeyPayload,
getAuthSAAKPayload
} from '../helpers/auth';
import {
UnauthorizedRequestError
@@ -41,14 +42,22 @@ const requireAuth = ({
acceptedAuthModes
});
req.authTokenType = authTokenType;
// attach auth payloads
let serviceTokenData: any;
switch (authTokenType) {
case 'serviceAccount':
req.serviceAccount = await getAuthSAAKPayload({
authTokenValue
});
break;
case 'serviceToken':
serviceTokenData = await getAuthSTDPayload({
authTokenValue
});
// TODO: bring this into a separate collection
requiredServiceTokenPermissions.forEach((requiredServiceTokenPermission) => {
if (!serviceTokenData.permissions.includes(requiredServiceTokenPermission)) {
return next(UnauthorizedRequestError({ message: 'Failed to authorize service token for endpoint' }));
@@ -60,6 +69,7 @@ const requireAuth = ({
break;
case 'apiKey':
// TODO: deprecate API key
req.user = await getAuthAPIKeyPayload({
authTokenValue
});
@@ -70,7 +80,7 @@ const requireAuth = ({
});
break;
}
return next();
}
}
+2 -2
View File
@@ -20,8 +20,8 @@ const requireBotAuth = ({
}
await validateMembership({
userId: req.user._id.toString(),
workspaceId: bot.workspace.toString(),
userId: req.user._id,
workspaceId: bot.workspace,
acceptedRoles
});
@@ -30,8 +30,8 @@ const requireIntegrationAuth = ({
}
await validateMembership({
userId: req.user._id.toString(),
workspaceId: integration.workspace.toString(),
userId: req.user._id,
workspaceId: integration.workspace,
acceptedRoles
});
@@ -38,8 +38,8 @@ const requireIntegrationAuthorizationAuth = ({
}
await validateMembership({
userId: req.user._id.toString(),
workspaceId: integrationAuth.workspace._id.toString(),
userId: req.user._id,
workspaceId: integrationAuth.workspace._id,
acceptedRoles
});
@@ -40,8 +40,8 @@ const requireMembershipAuth = ({
if (!userMembership) throw new Error('Failed to validate own membership')
const targetMembership = await validateMembership({
userId: req.user._id.toString(),
workspaceId: membership.workspace.toString(),
userId: req.user._id,
workspaceId: membership.workspace,
acceptedRoles
});
+2 -2
View File
@@ -32,8 +32,8 @@ const requireSecretAuth = ({
}
await validateMembership({
userId: req.user._id.toString(),
workspaceId: secret.workspace.toString(),
userId: req.user._id,
workspaceId: secret.workspace,
acceptedRoles
});
@@ -26,8 +26,8 @@ const requireServiceTokenDataAuth = ({
if (req.user) {
// case: jwt auth
await validateMembership({
userId: req.user._id.toString(),
workspaceId: serviceTokenData.workspace.toString(),
userId: req.user._id,
workspaceId: serviceTokenData.workspace,
acceptedRoles
});
}
+21 -12
View File
@@ -1,5 +1,7 @@
import { Request, Response, NextFunction } from 'express';
import { Types } from 'mongoose';
import { validateMembership } from '../helpers/membership';
import { validateClientForWorkspace } from '../helpers/workspace';
import { UnauthorizedRequestError } from '../utils/errors';
type req = 'params' | 'body' | 'query';
@@ -13,26 +15,33 @@ type req = 'params' | 'body' | 'query';
*/
const requireWorkspaceAuth = ({
acceptedRoles,
location = 'params'
locationWorkspaceId,
locationEnvironment = undefined
}: {
acceptedRoles: string[];
location?: req;
locationWorkspaceId: req;
locationEnvironment?: req | undefined;
}) => {
return async (req: Request, res: Response, next: NextFunction) => {
try {
const { workspaceId } = req[location];
if (req.user) {
// case: jwt auth
const membership = await validateMembership({
userId: req.user._id.toString(),
workspaceId,
acceptedRoles
});
// TODO: throw errors if workspaceId or environemnt are not present
const workspaceId = req[locationWorkspaceId]?.workspaceId;
const environment = locationEnvironment ? req[locationEnvironment]?.environment : undefined;
// validate clients
const { membership } = await validateClientForWorkspace({
userId: req.user?._id,
serviceAccountId: req.serviceAccount?._id,
serviceTokenDataId: req.serviceTokenData?._id,
workspaceId: new Types.ObjectId(workspaceId),
environment
});
if (membership) {
req.membership = membership;
}
if (
req.serviceTokenData
&& req.serviceTokenData.workspace.toString() !== workspaceId