Spaces:
Runtime error
Runtime error
| from flask import Blueprint, request, jsonify | |
| from utils.auth import hash_password, check_password, generate_token, verify_token | |
| import pymongo | |
| from bson import ObjectId | |
| # Define a Blueprint for authentication routes | |
| auth_bp = Blueprint('auth', __name__, url_prefix='/auth') | |
| # MongoDB connection | |
| client = pymongo.MongoClient("mongodb+srv://pmsankheb23:[email protected]/") | |
| db = client["Eloquence"] | |
| collections_user = db["user"] | |
| # ROUTE 1: Create a user using POST: auth/create, no auth required | |
| def create_user(): | |
| try: | |
| data = request.get_json() | |
| username = data['username'] | |
| email = data['email'] | |
| password = data['password'] | |
| # Check if user already exists | |
| if collections_user.find_one({'email': email}): | |
| return jsonify({"error": "User with this email already exists"}), 400 | |
| # Hash the password | |
| hashed_password = hash_password(password) | |
| # Insert the new user | |
| result = collections_user.insert_one({'username': username, 'password': hashed_password, 'email': email}) | |
| user_id = str(result.inserted_id) | |
| # Generate JWT token | |
| token = generate_token(username) # Or email, depending on your token strategy | |
| return jsonify({ | |
| "message": "User created", | |
| "authToken": token, | |
| "userId": user_id, | |
| "username": username | |
| }), 201 | |
| except Exception as e: | |
| return jsonify({"error": str(e)}), 500 | |
| # ROUTE 2: Authenticate a user using POST: auth/login, no login required | |
| def login_user(): | |
| try: | |
| data = request.get_json() | |
| email = data['email'] | |
| password = data['password'] | |
| user = collections_user.find_one({'email': email}) | |
| if not user: | |
| return jsonify({"error": "User not found"}), 404 | |
| if not check_password(user['password'], password): | |
| return jsonify({"error": "Invalid password"}), 401 | |
| user_id = str(user['_id']) | |
| username = user['username'] | |
| # Generate JWT token | |
| token = generate_token(username) # Or email, consistent with your token strategy | |
| return jsonify({ | |
| "message": "Login successful", | |
| "token": token, | |
| "userId": user_id, | |
| "username": username | |
| }), 200 | |
| except Exception as e: | |
| return jsonify({"error": str(e)}), 500 | |
| # ROUTE 3: Get logged-in user details using POST: auth/protected, login required | |
| def protected(): | |
| # Get token from the body as it's a post method | |
| token = request.json.get("token", None) | |
| if not token: | |
| return jsonify({"error": "Token missing"}), 401 | |
| # Remove 'Bearer ' from the token string if it's present | |
| token = token.replace("Bearer ", "") | |
| username = verify_token(token) # Verify the token | |
| if not username: | |
| return jsonify({"error": "Invalid or expired token"}), 401 | |
| return jsonify({"message": f"Hello, {username}! This is a protected route."}) | |