# IMMEDIATE FIX: Bridge JWT and Flask-Login # 1. UPDATE YOUR LOGIN ROUTE TO SUPPORT BOTH SYSTEMS @auth_bp.route('/login', methods=['POST']) def login(): try: data = request.get_json() if not data.get('email') or not data.get('password'): return jsonify({'error': 'Email and password are required'}), 400 # Find user by email user = User.query.filter_by(email=data['email']).first() if not user or not user.check_password(data['password']): return jsonify({'error': 'Invalid email or password'}), 401 if not user.is_active: return jsonify({'error': 'Account is deactivated'}), 401 # Update last login user.last_login = datetime.utcnow() db.session.commit() # CREATE BOTH JWT TOKEN AND FLASK-LOGIN SESSION access_token = create_access_token( identity=user.id, expires_delta=timedelta(days=7) ) # CRITICAL: Also log user in with Flask-Login from flask_login import login_user login_user(user, remember=True, duration=timedelta(days=7)) return jsonify({ 'message': 'Login successful', 'access_token': access_token, 'user': { 'id': user.id, 'email': user.email, 'first_name': user.first_name, 'last_name': user.last_name, 'role': user.role, 'total_points': user.total_points, 'current_level': user.current_level }, # IMPORTANT: Tell frontend where to redirect 'redirect_url': f'/dashboard/{user.role}' }), 200 except Exception as e: return jsonify({'error': str(e)}), 500 # 2. UPDATE YOUR MAIN ROUTES TO CHECK FLASK-LOGIN @app.route('/dashboard') def dashboard(): from flask_login import current_user, login_required # Check if user is logged in via Flask-Login if not current_user.is_authenticated: flash('Please login to access your dashboard', 'warning') return redirect(url_for('login')) # Redirect based on user role if current_user.role == 'contractor': return render_template('dashboard/contractor.html') else: return render_template('dashboard/worker.html') # 3. ADD FLASK-LOGIN SETUP TO YOUR APP from flask_login import LoginManager, UserMixin # Add to your User model class User(BaseModel, UserMixin): # Add UserMixin # ... existing code ... def get_id(self): return str(self.id) # Add to your app factory def create_app(): app = Flask(__name__) # ... existing code ... # Initialize Flask-Login login_manager = LoginManager() login_manager.init_app(app) login_manager.login_view = 'login' # Remove this line - it's causing the redirect loop @login_manager.user_loader def load_user(user_id): return User.query.get(int(user_id)) # ... rest of code ...