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
OAuth2 Password Flow with FastAPI
📖 Scenario: You are building a simple API that requires users to log in using their username and password. You want to secure your API endpoints using OAuth2 password flow, which is a common way to handle user authentication.
🎯 Goal: Create a FastAPI app that implements OAuth2 password flow. You will set up user data, configure OAuth2 password bearer, write the login logic to verify users, and protect an API route that only logged-in users can access.
📋 What You'll Learn
Create a dictionary called fake_users_db with one user entry: username alice and password secret123
Create an OAuth2PasswordBearer instance called oauth2_scheme with token URL /token
Write a function authenticate_user that takes username and password and returns True if they match the user in fake_users_db, else False
Create a /token POST route that accepts form data username and password, uses authenticate_user, and returns a JSON with access_token and token_type
Create a protected /users/me GET route that requires a valid token from oauth2_scheme and returns the current username
💡 Why This Matters
🌍 Real World
OAuth2 password flow is commonly used in APIs to securely authenticate users with username and password, issuing tokens for session management.
💼 Career
Understanding OAuth2 password flow is essential for backend developers building secure APIs and services that require user authentication.
Progress0 / 4 steps
1
Set up user data dictionary
Create a dictionary called fake_users_db with one user entry: key alice and value another dictionary with key password and value secret123.
FastAPI
Hint
Use a dictionary with username as key and a nested dictionary with password key.
2
Configure OAuth2PasswordBearer
Import OAuth2PasswordBearer from fastapi.security and create an instance called oauth2_scheme with tokenUrl="/token".
FastAPI
Hint
Use OAuth2PasswordBearer with the token URL where users will send their login data.
3
Write user authentication function
Define a function called authenticate_user that takes username and password. It returns True if username is in fake_users_db and the password matches, otherwise returns False.
FastAPI
Hint
Check if username exists and password matches, then return True, else False.
4
Create token and protected routes
Import FastAPI, Depends, and HTTPException from fastapi. Create a FastAPI app instance called app. Add a POST route /token that accepts form data username and password using OAuth2PasswordRequestForm. Use authenticate_user to verify credentials. If valid, return JSON with access_token set to username and token_type set to bearer. If invalid, raise HTTPException with status 401. Then add a GET route /users/me that depends on oauth2_scheme to get the token and returns JSON with username equal to the token.
FastAPI
Hint
Use OAuth2PasswordRequestForm to get form data, verify user, raise 401 if invalid, else return token. Protect /users/me with oauth2_scheme.
Practice
(1/5)
1. What is the main purpose of the OAuth2 password flow in FastAPI?
easy
A. To allow users to log in by sending their username and password directly to the app.
B. To register new users automatically without credentials.
C. To refresh access tokens without user interaction.
D. To encrypt user passwords before storing them.
Solution
Step 1: Understand OAuth2 password flow purpose
This flow lets users send their username and password to the app to get an access token.
Step 2: Compare options with flow purpose
Only To allow users to log in by sending their username and password directly to the app. describes this direct login method; others describe different features.
Final Answer:
To allow users to log in by sending their username and password directly to the app. -> Option A
Quick Check:
OAuth2 password flow = direct login [OK]
Hint: Password flow means user sends username and password [OK]
Common Mistakes:
Confusing password flow with token refresh
Thinking it registers users automatically
Assuming it encrypts passwords by itself
2. Which FastAPI import is used to handle OAuth2 password flow form data?
easy
A. from fastapi.security import OAuth2PasswordBearer
B. from fastapi.security import OAuth2PasswordRequestForm
C. from fastapi.security import HTTPBasicCredentials
D. from fastapi.security import APIKeyHeader
Solution
Step 1: Identify form class for password flow
FastAPI uses OAuth2PasswordRequestForm to parse username and password from form data.
Step 2: Check other imports
OAuth2PasswordBearer is for token extraction, HTTPBasicCredentials is for basic auth, APIKeyHeader is for API keys.
Final Answer:
from fastapi.security import OAuth2PasswordRequestForm -> Option B
Quick Check:
Form data handler = OAuth2PasswordRequestForm [OK]
Hint: Password flow form uses OAuth2PasswordRequestForm [OK]
Common Mistakes:
Using OAuth2PasswordBearer instead of RequestForm
Confusing HTTPBasicCredentials with OAuth2 forms
Importing unrelated security classes
3. Given this FastAPI endpoint using OAuth2 password flow, what will be the response if username is 'alice' and password is 'secret'?
from fastapi import FastAPI, Depends
from fastapi.security import OAuth2PasswordRequestForm
app = FastAPI()
@app.post('/token')
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
if form_data.username == 'alice' and form_data.password == 'secret':
return {'access_token': 'token123', 'token_type': 'bearer'}
return {'error': 'Invalid credentials'}
medium
A. {'access_token': 'token123', 'token_type': 'bearer'}
B. {'error': 'Invalid credentials'}
C. HTTP 422 Unprocessable Entity error
D. Empty response with status 204
Solution
Step 1: Check input credentials against condition
The code checks if username is 'alice' and password is 'secret'. Given inputs match this.
Step 2: Determine returned response
Since condition is true, it returns the access token dictionary with 'token123' and 'bearer'.
Final Answer:
{'access_token': 'token123', 'token_type': 'bearer'} -> Option A
Quick Check:
Correct credentials = access token response [OK]
Hint: Match username and password to get token response [OK]
Common Mistakes:
Assuming error response for correct credentials
Confusing HTTP errors with normal returns
Ignoring the if condition logic
4. What is wrong with this FastAPI OAuth2 password flow code snippet?
from fastapi import FastAPI, Depends
from fastapi.security import OAuth2PasswordRequestForm
app = FastAPI()
@app.post('/token')
async def login(form_data: OAuth2PasswordRequestForm):
if form_data.username == 'bob' and form_data.password == 'pass':
return {'access_token': 'abc', 'token_type': 'bearer'}
return {'error': 'Invalid'}
medium
A. Endpoint should use GET method instead of POST
B. Incorrect import of OAuth2PasswordRequestForm
C. Return type should be a string, not dict
D. Missing Depends() in function parameter for form_data
Solution
Step 1: Check function parameter for dependency injection
OAuth2PasswordRequestForm must be wrapped with Depends() to extract form data properly.
Step 2: Verify other parts
Imports are correct, return type as dict is valid JSON response, POST method is correct for token requests.
Final Answer:
Missing Depends() in function parameter for form_data -> Option D
Quick Check:
Use Depends() to get form data [OK]
Hint: Always wrap OAuth2PasswordRequestForm with Depends() [OK]
Common Mistakes:
Forgetting Depends() causes runtime errors
Using GET instead of POST for token endpoint
Thinking return must be string, not dict
5. You want to secure a FastAPI endpoint so only users with a valid OAuth2 password flow token can access it. Which approach correctly uses OAuth2PasswordBearer and token verification?