Protected routes keep parts of your app safe. Only allowed users can see or use them.
Protected routes in FastAPI
from fastapi import Depends, FastAPI, HTTPException, status from fastapi.security import OAuth2PasswordBearer app = FastAPI() oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") def get_current_user(token: str = Depends(oauth2_scheme)): if token != "fake-super-secret-token": raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid authentication credentials", headers={"WWW-Authenticate": "Bearer"}, ) return {"username": "user1"} @app.get("/protected") async def protected_route(current_user: dict = Depends(get_current_user)): return {"message": f"Hello {current_user['username']}! This is a protected route."}
Depends tells FastAPI to run a function before the route to check something.
OAuth2PasswordBearer helps get the token from the request header.
from fastapi import Depends, FastAPI app = FastAPI() def verify_user(): # Simple check return True @app.get("/open") async def open_route(): return {"message": "Anyone can see this."} @app.get("/secure") async def secure_route(verified: bool = Depends(verify_user)): if not verified: return {"error": "Not allowed"} return {"message": "Only verified users."}
from fastapi import Depends, FastAPI, HTTPException, status from fastapi.security import OAuth2PasswordBearer app = FastAPI() oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") def get_current_user(token: str = Depends(oauth2_scheme)): if token != "valid-token": raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid token") return {"username": "user123"} @app.get("/dashboard") async def dashboard(user: dict = Depends(get_current_user)): return {"message": f"Welcome {user['username']} to your dashboard."}
This FastAPI app has one protected route at /protected. It checks the token sent by the user. If the token is correct, it shows a welcome message. If not, it sends an error.
from fastapi import Depends, FastAPI, HTTPException, status from fastapi.security import OAuth2PasswordBearer app = FastAPI() oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") def get_current_user(token: str = Depends(oauth2_scheme)): if token != "fake-super-secret-token": raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid authentication credentials", headers={"WWW-Authenticate": "Bearer"}, ) return {"username": "user1"} @app.get("/protected") async def protected_route(current_user: dict = Depends(get_current_user)): return {"message": f"Hello {current_user['username']}! This is a protected route."}
Always send the token in the Authorization header as Bearer <token>.
Use HTTPS to keep tokens safe during transfer.
You can customize get_current_user to check real users from a database.
Protected routes keep parts of your app safe by checking user tokens.
Use Depends with a function that verifies the user before allowing access.
FastAPI's OAuth2PasswordBearer helps get tokens from requests easily.
Practice
Solution
Step 1: Understand what protected routes do
Protected routes limit access to certain parts of an app by checking if the user is allowed.Step 2: Identify the correct purpose
Only To restrict access to certain endpoints by verifying user credentials describes restricting access by verifying user credentials, which matches protected routes.Final Answer:
To restrict access to certain endpoints by verifying user credentials -> Option DQuick Check:
Protected routes = restrict access [OK]
- Thinking protected routes improve speed
- Confusing protected routes with documentation features
- Assuming protected routes allow open access
Solution
Step 1: Recall FastAPI dependency injection
FastAPI usesDependsto declare dependencies like authentication checks.Step 2: Match feature to protected routes
UsingDependswith a function that verifies tokens enforces protection on routes.Final Answer:
Depends -> Option BQuick Check:
Token check uses Depends [OK]
- Confusing Depends with query or path parameters
- Using BackgroundTasks for authentication
- Not using any dependency for protection
/users/me without a token?
from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
def get_current_user(token: str = Depends(oauth2_scheme)):
if token != "validtoken":
raise HTTPException(status_code=401, detail="Invalid token")
return {"username": "user1"}
@app.get("/users/me")
async def read_users_me(current_user: dict = Depends(get_current_user)):
return current_userSolution
Step 1: Analyze token dependency behavior
The functionget_current_userchecks if the token equals "validtoken"; otherwise, it raises HTTP 401.Step 2: Consider no token case
Without a token,oauth2_schemewill not provide a valid token, so the check fails and raises HTTP 401.Final Answer:
Raises HTTP 401 Unauthorized error -> Option AQuick Check:
No token = HTTP 401 error [OK]
- Assuming it returns user data without token
- Confusing 401 with 404 error
- Expecting empty response instead of error
from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
def get_current_user(token: str):
if token != "secret":
raise HTTPException(status_code=401, detail="Unauthorized")
return {"user": "admin"}
@app.get("/dashboard")
async def dashboard(user: dict = Depends(get_current_user)):
return userSolution
Step 1: Check get_current_user parameter
The function expectstoken: strbut does not useDepends(oauth2_scheme)to get the token automatically.Step 2: Identify missing dependency injection
WithoutDepends(oauth2_scheme), FastAPI won't provide the token, causing an error.Final Answer:
Missing Depends in get_current_user parameter -> Option CQuick Check:
Token param needs Depends(oauth2_scheme) [OK]
- Forgetting to import HTTPException
- Not using Depends for token parameter
- Incorrect route path syntax
Solution
Step 1: Understand reusable dependency pattern
Creating a function that uses OAuth2PasswordBearer to get the token and verifies the user allows reuse across routes.Step 2: Apply Depends to routes
Using Depends with this function on multiple routes enforces protection without repeating code.Final Answer:
Create a reusable dependency function that uses OAuth2PasswordBearer to get the token and verifies the user, then use Depends on routes -> Option AQuick Check:
Reusable dependency + Depends = efficient protection [OK]
- Duplicating token checks in every route
- Not using Depends for token verification
- Ignoring server-side token checks
Ready to prove it?
Pass the test and this pattern moves unknown
