[Authorization/Permissions]: Use scopes in both route and API endpoint level #4611
-
|
Consider a route file having following code snippets
router = APIRouter(
prefix="/blog",
tags=["Blogs"],
dependencies=[Security(token.get_current_user, scopes=["blog:read"])]
)
@router.get("/", response_model=List[schemas.ShowBlog])
def get_all(db: Session = Depends(get_db), current_user: User = Security(token.get_current_user, scopes=["blog:admin"])):
...My question is: Appreciate any help/thoughts. |
Beta Was this translation helpful? Give feedback.
Answered by
YuriiMotov
Jun 19, 2025
Replies: 1 comment
-
|
This works fine at least in current version (0.115.13). from typing import Annotated
from fastapi import APIRouter, Depends, FastAPI, Security
from fastapi.security import OAuth2PasswordBearer, SecurityScopes
from fastapi.testclient import TestClient
oauth2_scheme = OAuth2PasswordBearer(
tokenUrl="token",
scopes={"blog:read": "Read information.", "blog:admin": "Full access."},
)
async def get_token_validated_parsed(
scopes: SecurityScopes, token: Annotated[str, Depends(oauth2_scheme)]
):
print("get_token_validated_parsed is called with scopes:", scopes.scopes)
return token
async def get_current_user(token: str = Depends(get_token_validated_parsed)):
return {"username": "testuser"}
router = APIRouter(
prefix="/blog",
tags=["Blogs"],
dependencies=[Security(get_current_user, scopes=["blog:read"])],
)
@router.get("/")
def get_all(current_user: str = Security(get_current_user, scopes=["blog:admin"])):
pass
app = FastAPI()
app.include_router(router)
# Test
def test_():
log = []
async def get_token_mock(
scopes: SecurityScopes, token: Annotated[str, Depends(oauth2_scheme)]
):
log.append(str(scopes.scopes))
return token
app.dependency_overrides[get_token_validated_parsed] = get_token_mock
client = TestClient(app)
response = client.get("/blog/", headers={"Authorization": "Bearer testtoken"})
assert response.status_code == 200, response.text
assert len(log) == 2
assert "['blog:read']" in log
assert "['blog:admin']" in log |
Beta Was this translation helpful? Give feedback.
0 replies
Answer selected by
YuriiMotov
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This works fine at least in current version (0.115.13).
get_current_user(and its sub-dependencies) will be called twice with different scopes.