Encryption Implementation Guide
Full Configuration
from cryptography.fernet import Fernet
from two_fast_auth import TwoFactorMiddleware, TwoFactorAuth
ENCRYPTION_KEY = Fernet.generate_key()  # Store securely in production
app.add_middleware(
    TwoFactorMiddleware,
    get_user_secret_callback=get_encrypted_secret,
    encryption_key=ENCRYPTION_KEY,
    excluded_paths=["/setup-2fa", "/verify-2fa"]
)
async def get_encrypted_secret(user_id: str) -> str:
    # Return encrypted secret from your database
    return await fetch_encrypted_secret(user_id)
Auth Endpoints
@app.post("/setup-2fa")
async def setup_2fa_endpoint(user: User = Depends(current_user)):
    tfa = TwoFactorAuth()
    encrypted_secret = TwoFactorAuth.encrypt_secret(
        tfa.secret,
        ENCRYPTION_KEY
    )
    await store_encrypted_secret(user.id, encrypted_secret)
    return {
        "qr_code": tfa.generate_qr_code(user.email),
        "encrypted_secret": encrypted_secret
    }
@app.post("/verify-2fa")
async def verify_2fa_endpoint(code: str, user: User = Depends(current_user)):
    encrypted_secret = await get_encrypted_secret(user.id)
    secret = TwoFactorAuth.decrypt_secret(encrypted_secret, ENCRYPTION_KEY)
    if not TwoFactorAuth(secret).verify_code(code):
        raise HTTPException(401, "Invalid 2FA code")
    return {"status": "verified"}
Protected Endpoint
@app.get("/protected-data")
async def protected_data(user: User = Depends(current_active_user)):
    return {"data": "Sensitive encrypted data"}
Testing Workflow
- Generate encryption key: Fernet.generate_key()
- Start server with encryption middleware
- Setup 2FA to get encrypted secret
- Verify requests automatically decrypt secrets
- Test with invalid encryption key to validate security
Notes