Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: minor backend improvement part2 #860

Merged
merged 19 commits into from
Sep 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
43e7e7b
WIP some TODO
ianliuwk1019 Aug 23, 2023
722bea3
Add authorize_by_application_role fastapi dependency for validation.
ianliuwk1019 Aug 30, 2023
78ce1ca
Refactor authorize_by_app_id to router dependency
ianliuwk1019 Aug 30, 2023
8cc7c88
Replace authorize_by_app_id with authorize_by_application_role as dep…
ianliuwk1019 Aug 30, 2023
2bf05ae
Merge branch 'main' into fix/minor-backend-improvement
ianliuwk1019 Aug 30, 2023
f82a638
Remove redundant authorize_by_app_id since authorize_by_application_r…
ianliuwk1019 Aug 30, 2023
7215f3e
Refactor Requester class into schemas.py
ianliuwk1019 Aug 31, 2023
d77bb2f
Refactor jwt_validation some functions to new router_guards.py
ianliuwk1019 Aug 31, 2023
5a54090
Use orm_mode for Requester and conveniently convert it from model usi…
ianliuwk1019 Aug 31, 2023
2d568fd
Further refactor for get_request_role_from_id
ianliuwk1019 Aug 31, 2023
71e7c22
Add comment for Requester and add new TargetUser.
ianliuwk1019 Sep 1, 2023
057bcb4
Create "enforce_self_grant_guard" for router and remove same code fro…
ianliuwk1019 Sep 1, 2023
ee4592e
Minor fix for tests.
ianliuwk1019 Sep 1, 2023
4481d5c
Minor cleaup and commenting.
ianliuwk1019 Sep 1, 2023
af3e4a7
Merge branch 'main' into fix/minor-backend-improvement-part2
ianliuwk1019 Sep 1, 2023
624bc6c
Fix tests failing due to not reseting dependency override for next te…
ianliuwk1019 Sep 4, 2023
e37c719
Merge branch 'main' into fix/minor-backend-improvement-part2
ianliuwk1019 Sep 6, 2023
4c03af2
Merge branch 'main' into fix/minor-backend-improvement-part2
ianliuwk1019 Sep 6, 2023
7dbd822
Merge branch 'main' into fix/minor-backend-improvement-part2
ianliuwk1019 Sep 6, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions server/backend/api/app/integration/idim_proxy.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import logging

import requests
from api.app.requester import Requester
from api.app.schemas import IdimProxySearchParamIdir
from api.app.schemas import IdimProxySearchParamIdir, Requester
from api.config import config

LOGGER = logging.getLogger(__name__)
Expand Down
46 changes: 6 additions & 40 deletions server/backend/api/app/jwt_validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,18 @@
import logging
from urllib.request import urlopen

from api.app.crud import crud_application
from fastapi import Depends, HTTPException
from fastapi.security import OAuth2AuthorizationCodeBearer
from jose import jwt

from api.app.constants import COGNITO_USERNAME_KEY

# think that just importing config then access through its namespace makes code
# easier to understand, ie:
# import config
# then
# config.get_aws_region()
from api.config.config import (
get_aws_region,
get_user_pool_domain_name,
get_user_pool_id,
get_oidc_client_id,
)
from api.config.config import (get_aws_region, get_oidc_client_id,
get_user_pool_domain_name, get_user_pool_id)
from fastapi import Depends, HTTPException
from fastapi.security import OAuth2AuthorizationCodeBearer
from jose import jwt
from sqlalchemy.orm import Session

JWT_GROUPS_KEY = "cognito:groups"
JWT_CLIENT_ID_KEY = "client_id"
Expand All @@ -36,7 +30,6 @@
ERROR_VALIDATION = "validation_failed"
ERROR_GROUPS_REQUIRED = "authorization_groups_required"
ERROR_PERMISSION_REQUIRED = "permission_required_for_operation"
ERROR_INVALID_APPLICATION_ID = "invalid_application_id"

aws_region = get_aws_region()
user_pool_id = get_user_pool_id()
Expand All @@ -52,7 +45,6 @@

_jwks = None


def init_jwks():
global _jwks

Expand Down Expand Up @@ -207,32 +199,6 @@ def authorize(claims: dict = Depends(validate_token)) -> dict:
return claims


def authorize_by_app_id(application_id, db, claims):
application = crud_application.get_application(application_id=application_id, db=db)
if not application:
raise HTTPException(
status_code=403,
detail={
"code": ERROR_INVALID_APPLICATION_ID,
"description": f"Application ID {application_id} not found",
},
headers={"WWW-Authenticate": "Bearer"},
)

required_role = f"{application.application_name.upper()}_ACCESS_ADMIN"
access_roles = get_access_roles(claims)

if required_role not in access_roles:
raise HTTPException(
status_code=403,
detail={
"code": ERROR_PERMISSION_REQUIRED,
"description": f"Operation requires role {required_role}",
},
headers={"WWW-Authenticate": "Bearer"},
)


def get_access_roles(claims: dict = Depends(authorize)):
groups = claims[JWT_GROUPS_KEY]
return groups
Expand Down
71 changes: 0 additions & 71 deletions server/backend/api/app/requester.py

This file was deleted.

17 changes: 5 additions & 12 deletions server/backend/api/app/routers/router_application.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import logging

from typing import List

from api.app.crud import crud_application
from api.app.routers.router_guards import authorize_by_app_id
from fastapi import APIRouter, Depends, Response
from sqlalchemy.orm import Session
from .. import database, schemas, jwt_validation

from .. import database, jwt_validation, schemas

LOGGER = logging.getLogger(__name__)

Expand Down Expand Up @@ -40,21 +41,17 @@ def get_applications(
"/{application_id}/fam_roles",
response_model=List[schemas.FamApplicationRole],
status_code=200,
dependencies=[Depends(authorize_by_app_id)] # Enforce application-level security
)
def get_fam_application_roles(
application_id: int,
db: Session = Depends(database.get_db),
token_claims: dict = Depends(jwt_validation.authorize)
):
"""gets the roles associated with an application

:param application_id: application id
:param db: database session, defaults to Depends(database.get_db)
"""

# Enforce application-level security
jwt_validation.authorize_by_app_id(application_id, db, token_claims)

LOGGER.debug(f"Recieved application id: {application_id}")
app_roles = crud_application.get_application_roles(
application_id=application_id, db=db
Expand All @@ -66,21 +63,17 @@ def get_fam_application_roles(
"/{application_id}/user_role_assignment",
response_model=List[schemas.FamApplicationUserRoleAssignmentGet],
status_code=200,
dependencies=[Depends(authorize_by_app_id)] # Enforce application-level security
)
def get_fam_application_user_role_assignment(
application_id: int,
db: Session = Depends(database.get_db),
token_claims: dict = Depends(jwt_validation.authorize)
):
"""gets the roles associated with an application

:param application_id: application id
:param db: database session, defaults to Depends(database.get_db)
"""

# Enforce application-level security
jwt_validation.authorize_by_app_id(application_id, db, token_claims)

LOGGER.debug(f"Loading application role assigments for application_id: {application_id}")
app_user_role_assignment = crud_application.get_application_role_assignments(
db=db, application_id=application_id
Expand Down
Loading
Loading