2 changed files with 130 additions and 15 deletions
@ -0,0 +1,82 @@ |
|||||
|
# Ref: https://github.com/fastapi/fastapi/issues/3317 |
||||
|
|
||||
|
from fastapi import APIRouter, FastAPI, Security |
||||
|
from fastapi.security import OAuth2AuthorizationCodeBearer, OAuth2PasswordBearer |
||||
|
from fastapi.testclient import TestClient |
||||
|
|
||||
|
auth_code_scheme = OAuth2AuthorizationCodeBearer() |
||||
|
auth_code_router = APIRouter() |
||||
|
|
||||
|
|
||||
|
@auth_code_router.get("/private-route") |
||||
|
async def private_route(token: str | None = Security(auth_code_scheme, scopes=["admin"])): |
||||
|
return {"token": token} |
||||
|
|
||||
|
|
||||
|
def create_auth_code_app() -> FastAPI: |
||||
|
app = FastAPI() |
||||
|
app.include_router(auth_code_router) |
||||
|
auth_code_scheme.initialize( |
||||
|
authorizationUrl="https://example.com/authorize", |
||||
|
tokenUrl="https://example.com/oauth/token", |
||||
|
scopes={"admin": "Admin access"}, |
||||
|
) |
||||
|
return app |
||||
|
|
||||
|
|
||||
|
def test_oauth2_authorization_code_bearer_lazy_initialize(): |
||||
|
app = create_auth_code_app() |
||||
|
client = TestClient(app) |
||||
|
|
||||
|
response = client.get( |
||||
|
"/private-route", headers={"Authorization": "Bearer testtoken"} |
||||
|
) |
||||
|
assert response.status_code == 200, response.text |
||||
|
assert response.json() == {"token": "testtoken"} |
||||
|
|
||||
|
openapi = client.get("/openapi.json") |
||||
|
assert openapi.status_code == 200, openapi.text |
||||
|
authorization_code_flow = openapi.json()["components"]["securitySchemes"][ |
||||
|
"OAuth2AuthorizationCodeBearer" |
||||
|
]["flows"]["authorizationCode"] |
||||
|
assert authorization_code_flow["authorizationUrl"] == "https://example.com/authorize" |
||||
|
assert authorization_code_flow["tokenUrl"] == "https://example.com/oauth/token" |
||||
|
assert authorization_code_flow["scopes"] == {"admin": "Admin access"} |
||||
|
|
||||
|
|
||||
|
password_scheme = OAuth2PasswordBearer() |
||||
|
password_router = APIRouter() |
||||
|
|
||||
|
|
||||
|
@password_router.get("/password-route") |
||||
|
async def password_route(token: str | None = Security(password_scheme)): |
||||
|
return {"token": token} |
||||
|
|
||||
|
|
||||
|
def create_password_app() -> FastAPI: |
||||
|
app = FastAPI() |
||||
|
app.include_router(password_router) |
||||
|
password_scheme.initialize( |
||||
|
tokenUrl="https://example.com/oauth/token", |
||||
|
scopes={"read": "Read access"}, |
||||
|
) |
||||
|
return app |
||||
|
|
||||
|
|
||||
|
def test_oauth2_password_bearer_lazy_initialize(): |
||||
|
app = create_password_app() |
||||
|
client = TestClient(app) |
||||
|
|
||||
|
response = client.get( |
||||
|
"/password-route", headers={"Authorization": "Bearer testtoken"} |
||||
|
) |
||||
|
assert response.status_code == 200, response.text |
||||
|
assert response.json() == {"token": "testtoken"} |
||||
|
|
||||
|
openapi = client.get("/openapi.json") |
||||
|
assert openapi.status_code == 200, openapi.text |
||||
|
password_flow = openapi.json()["components"]["securitySchemes"][ |
||||
|
"OAuth2PasswordBearer" |
||||
|
]["flows"]["password"] |
||||
|
assert password_flow["tokenUrl"] == "https://example.com/oauth/token" |
||||
|
assert password_flow["scopes"] == {"read": "Read access"} |
||||
Loading…
Reference in new issue