Bird
Raised Fist0
FastAPIframework~5 mins

Protected routes in FastAPI

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction

Protected routes keep parts of your app safe. Only allowed users can see or use them.

When you want only logged-in users to access their profile page.
When you need to hide admin controls from regular users.
When you want to protect sensitive data like payment info.
When you want to check user permissions before showing certain pages.
Syntax
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.

Examples
This example shows a simple dependency that always allows access. The secure route uses it to check before responding.
FastAPI
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."}
This example uses OAuth2 token checking to protect the dashboard route.
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 != "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."}
Sample Program

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.

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."}
OutputSuccess
Important Notes

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.

Summary

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

(1/5)
1. What is the main purpose of protected routes in FastAPI?
easy
A. To automatically generate API documentation
B. To speed up the API response time
C. To allow anyone to access all endpoints without restrictions
D. To restrict access to certain endpoints by verifying user credentials

Solution

  1. Step 1: Understand what protected routes do

    Protected routes limit access to certain parts of an app by checking if the user is allowed.
  2. 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.
  3. Final Answer:

    To restrict access to certain endpoints by verifying user credentials -> Option D
  4. Quick Check:

    Protected routes = restrict access [OK]
Hint: Protected routes check user access before allowing endpoint use [OK]
Common Mistakes:
  • Thinking protected routes improve speed
  • Confusing protected routes with documentation features
  • Assuming protected routes allow open access
2. Which FastAPI feature is commonly used to enforce protected routes by requiring token verification?
easy
A. BackgroundTasks
B. Depends
C. Query
D. Path

Solution

  1. Step 1: Recall FastAPI dependency injection

    FastAPI uses Depends to declare dependencies like authentication checks.
  2. Step 2: Match feature to protected routes

    Using Depends with a function that verifies tokens enforces protection on routes.
  3. Final Answer:

    Depends -> Option B
  4. Quick Check:

    Token check uses Depends [OK]
Hint: Use Depends to add token checks on routes [OK]
Common Mistakes:
  • Confusing Depends with query or path parameters
  • Using BackgroundTasks for authentication
  • Not using any dependency for protection
3. Given this FastAPI code snippet, what will happen when accessing /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_user
medium
A. Raises HTTP 401 Unauthorized error
B. Returns {"username": "user1"} regardless of token
C. Returns an empty response
D. Raises HTTP 404 Not Found error

Solution

  1. Step 1: Analyze token dependency behavior

    The function get_current_user checks if the token equals "validtoken"; otherwise, it raises HTTP 401.
  2. Step 2: Consider no token case

    Without a token, oauth2_scheme will not provide a valid token, so the check fails and raises HTTP 401.
  3. Final Answer:

    Raises HTTP 401 Unauthorized error -> Option A
  4. Quick Check:

    No token = HTTP 401 error [OK]
Hint: No valid token triggers HTTP 401 error [OK]
Common Mistakes:
  • Assuming it returns user data without token
  • Confusing 401 with 404 error
  • Expecting empty response instead of error
4. Identify the error in this FastAPI protected route code:
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 user
medium
A. OAuth2PasswordBearer is not imported
B. HTTPException is not imported
C. Missing Depends in get_current_user parameter
D. Route path is invalid

Solution

  1. Step 1: Check get_current_user parameter

    The function expects token: str but does not use Depends(oauth2_scheme) to get the token automatically.
  2. Step 2: Identify missing dependency injection

    Without Depends(oauth2_scheme), FastAPI won't provide the token, causing an error.
  3. Final Answer:

    Missing Depends in get_current_user parameter -> Option C
  4. Quick Check:

    Token param needs Depends(oauth2_scheme) [OK]
Hint: Use Depends(oauth2_scheme) to get token in dependencies [OK]
Common Mistakes:
  • Forgetting to import HTTPException
  • Not using Depends for token parameter
  • Incorrect route path syntax
5. How can you combine FastAPI's OAuth2PasswordBearer with a custom user verification function to protect multiple routes efficiently?
hard
A. Create a reusable dependency function that uses OAuth2PasswordBearer to get the token and verifies the user, then use Depends on routes
B. Add token verification code inside each route handler separately
C. Use OAuth2PasswordBearer only in the main app instance without dependencies
D. Skip token verification and rely on client-side checks

Solution

  1. Step 1: Understand reusable dependency pattern

    Creating a function that uses OAuth2PasswordBearer to get the token and verifies the user allows reuse across routes.
  2. Step 2: Apply Depends to routes

    Using Depends with this function on multiple routes enforces protection without repeating code.
  3. Final Answer:

    Create a reusable dependency function that uses OAuth2PasswordBearer to get the token and verifies the user, then use Depends on routes -> Option A
  4. Quick Check:

    Reusable dependency + Depends = efficient protection [OK]
Hint: Make one verify function and reuse with Depends on routes [OK]
Common Mistakes:
  • Duplicating token checks in every route
  • Not using Depends for token verification
  • Ignoring server-side token checks