Repository navigation
Authentication System
The authentication system handles user registration, login, logout, password reset, and email verification. It uses Flask-Login for session management and Werkzeug for secure password hashing.
User Model (app/models.py)
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True, nullable=False)
email = db.Column(db.String(120), index=True, unique=True, nullable=False)
password_hash = db.Column(db.String(256), nullable=False)
is_admin = db.Column(db.Boolean, default=False)
is_verified = db.Column(db.Boolean, default=False)
verification_token = db.Column(db.String(256))
reset_token = db.Column(db.String(256))
reset_token_expiration = db.Column(db.DateTime)
created_at = db.Column(db.DateTime, default=datetime.utcnow)LoginForm (app/auth/forms.py)
- Username field
- Password field
- Remember me checkbox
- Submit button
RegistrationForm (app/auth/forms.py)
- Username field (min 4, max 64 characters)
- Email field with validation
- Password field (min 8 characters)
- Password confirmation field
- Submit button
ResetPasswordRequestForm (app/auth/forms.py)
- Email field
- Submit button
ResetPasswordForm (app/auth/forms.py)
- Password field (min 8 characters)
- Password confirmation field
- Submit button
Login Route (/auth/login)
- Method: GET, POST
- Rate limit: 10 requests per minute
- Validates credentials
- Creates session with Flask-Login
- Supports "Remember Me" functionality
Registration Route (/auth/register)
- Method: GET, POST
- Rate limit: 3 requests per hour
- Creates new user account
- Generates verification token
- Sends verification email (token displayed for testing)
- Password is hashed before storage
Logout Route (/auth/logout)
- Destroys session
- Redirects to home page
Password Reset Request (/auth/reset_password_request)
- Method: GET, POST
- Rate limit: 3 requests per hour
- Generates secure reset token
- Token expires after 1 hour
- Sends email with reset link (token displayed for testing)
Password Reset (/auth/reset_password/<token>)
- Method: GET, POST
- Rate limit: 5 requests per hour
- Validates token and expiration
- Updates password
- Clears reset token
Email Verification (/auth/verify/<token>)
- Validates verification token
- Marks user as verified
- Clears verification token
Resend Verification (/auth/resend_verification)
- Method: GET, POST
- Rate limit: 3 requests per hour
- Regenerates verification token
- Sends verification email
- Uses Werkzeug's
generate_password_hash() - PBKDF2 with SHA-256 algorithm
- Salt is automatically generated
- Hashes are one-way (cannot be reversed)
- Flask-Login handles session creation
- Sessions are secure with HttpOnly flag
- Session timeout can be configured
- "Remember Me" extends session duration
- All forms include CSRF tokens
- Tokens are validated on submission
- Prevents cross-site request forgery
- Login: 10 requests per minute
- Registration: 3 requests per hour
- Password reset: 3 requests per hour
- Prevents brute force attacks
- Verification tokens: 32-byte URL-safe random strings
- Reset tokens: 32-byte URL-safe random strings
- Tokens expire after 1 hour
- Tokens are single-use
- User registers account
- System generates verification token
- Token is stored in user record
- Email sent with verification link (token displayed for testing)
- User clicks verification link
- System validates token
- User marked as verified
- Token cleared from database
- User requests password reset
- System validates email exists
- Generates reset token with 1-hour expiration
- Email sent with reset link (token displayed for testing)
- User clicks reset link
- System validates token and expiration
- User enters new password
- Password is hashed and updated
- Token cleared from database
-
SECRET_KEY: Flask secret key for session encryption -
SECURITY_PASSWORD_SALT: Salt for password hashing (optional)
- Session lifetime: configurable via Flask settings
- Cookie security: HttpOnly, Secure flags (production)
- Use strong, unique passwords
- Enable email verification
- Use password reset when needed
- Keep email address current
- Monitor failed login attempts
- Enforce password complexity
- Regular security audits
- Keep Flask secret key secure
- Use HTTPS in production
-
Problem: "Invalid username or password"
- Check credentials are correct
- Verify email is verified
- Ensure account exists
-
Problem: Session expires too quickly
- Check session configuration
- Enable "Remember Me" option
- Increase session timeout
-
Problem: Email already registered
- Use password reset instead
- Contact admin for account recovery
-
Problem: Username taken
- Choose a different username
- Username is case-insensitive
-
Problem: Invalid or expired token
- Request a new reset link
- Token expires after 1 hour
-
Problem: Email not received
- Check spam folder
- Verify email address is correct
- Token is displayed in flash message for testing
- Two-factor authentication (2FA)
- OAuth2 integration (Google, GitHub)
- Social login support
- Password strength meter
- Account lockout after failed attempts
- IP-based access control
- Session management UI for users