OAuth2 password flow lets users log in by giving their username and password directly to your app. It helps your app get a token to access protected data safely.
OAuth2 password flow in FastAPI
Start learning this pattern below
Jump into concepts and practice - no test required
from fastapi import FastAPI, Depends from fastapi.security import OAuth2PasswordRequestForm app = FastAPI() @app.post('/token') async def login(form_data: OAuth2PasswordRequestForm = Depends()): username = form_data.username password = form_data.password # Verify username and password here # Return access token if valid return {'access_token': 'token123', 'token_type': 'bearer'}
Use OAuth2PasswordRequestForm to get username and password from form data.
The endpoint usually returns a JSON with access_token and token_type.
from fastapi import FastAPI, Depends from fastapi.security import OAuth2PasswordRequestForm app = FastAPI() @app.post('/token') async def login(form_data: OAuth2PasswordRequestForm = Depends()): return {'access_token': form_data.username + '_token', 'token_type': 'bearer'}
from fastapi import FastAPI, Depends, HTTPException from fastapi.security import OAuth2PasswordRequestForm app = FastAPI() @app.post('/token') async def login(form_data: OAuth2PasswordRequestForm = Depends()): if form_data.username != 'user' or form_data.password != 'pass': raise HTTPException(status_code=400, detail='Incorrect username or password') return {'access_token': 'securetoken123', 'token_type': 'bearer'}
This FastAPI app has a /token endpoint that accepts username and password using OAuth2 password flow. It checks the username and password against a fake database. If correct, it returns an access token. If not, it returns an error.
from fastapi import FastAPI, Depends, HTTPException from fastapi.security import OAuth2PasswordRequestForm from fastapi.responses import JSONResponse app = FastAPI() fake_users_db = { 'alice': 'wonderland123', 'bob': 'builder456' } @app.post('/token') async def login(form_data: OAuth2PasswordRequestForm = Depends()): username = form_data.username password = form_data.password if username not in fake_users_db or fake_users_db[username] != password: raise HTTPException(status_code=400, detail='Incorrect username or password') token = f'{username}_token_abc123' return {'access_token': token, 'token_type': 'bearer'}
Never use OAuth2 password flow in apps you don't fully control because users share their passwords.
Always use HTTPS to protect username and password during transmission.
In real apps, verify passwords securely and generate real tokens (like JWT).
OAuth2 password flow lets users log in by sending username and password to your app.
FastAPI provides OAuth2PasswordRequestForm to handle this easily.
Use this flow only in trusted apps and always protect user data carefully.
Practice
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 AQuick Check:
OAuth2 password flow = direct login [OK]
- Confusing password flow with token refresh
- Thinking it registers users automatically
- Assuming it encrypts passwords by itself
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 BQuick Check:
Form data handler = OAuth2PasswordRequestForm [OK]
- Using OAuth2PasswordBearer instead of RequestForm
- Confusing HTTPBasicCredentials with OAuth2 forms
- Importing unrelated security classes
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'}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 AQuick Check:
Correct credentials = access token response [OK]
- Assuming error response for correct credentials
- Confusing HTTP errors with normal returns
- Ignoring the if condition logic
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'}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 DQuick Check:
Use Depends() to get form data [OK]
- Forgetting Depends() causes runtime errors
- Using GET instead of POST for token endpoint
- Thinking return must be string, not dict
from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl='token')
def verify_token(token: str):
if token != 'validtoken':
raise HTTPException(status_code=401, detail='Invalid token')
@app.get('/secure-data')
async def secure_data(token: str = Depends(oauth2_scheme)):
verify_token(token)
return {'data': 'secret info'}Solution
Step 1: Check OAuth2PasswordBearer usage
oauth2_scheme is created with tokenUrl='token', which is correct for password flow token endpoint.Step 2: Verify token validation logic
verify_token raises HTTPException on invalid token, which is proper for access control.Step 3: Confirm endpoint dependency and response
secure_data depends on oauth2_scheme to get token, verifies it, then returns protected data.Final Answer:
Correct: uses OAuth2PasswordBearer and verifies token before returning data. -> Option CQuick Check:
Use OAuth2PasswordBearer + verify token = secure endpoint [OK]
- Setting wrong tokenUrl in OAuth2PasswordBearer
- Not raising exceptions on invalid token
- Thinking OAuth2PasswordBearer can't be used with GET
