Protected routes keep parts of your app safe. Only allowed users can see or use them.
Protected routes in FastAPI
Start learning this pattern below
Jump into concepts and practice - no test required
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
