|
| 1 | +from flask import request, jsonify, Blueprint, session, make_response |
| 2 | +from app import app, bcrypt |
| 3 | +from app.models import User, bcrypt |
| 4 | +from werkzeug.utils import secure_filename |
| 5 | +import os |
| 6 | +import uuid |
| 7 | +import jwt |
| 8 | +import datetime |
| 9 | + |
| 10 | +from bcrypt import checkpw, hashpw, gensalt |
| 11 | + |
| 12 | +# Create a Blueprint for auth routes |
| 13 | +auth_bp = Blueprint('auth', __name__) |
| 14 | + |
| 15 | +# Register route |
| 16 | +@auth_bp.route('/register', methods=['POST']) |
| 17 | +def register(): |
| 18 | + if request.method == 'POST': |
| 19 | + |
| 20 | + name = request.form.get('name') |
| 21 | + email= request.form.get('email') |
| 22 | + password = request.form.get('password') |
| 23 | + image_file = request.files.get('image') |
| 24 | + |
| 25 | + if not name or not email or not password: |
| 26 | + return {'error':'Invalid JSON data'}, 400 # Return error response for invalid JSON |
| 27 | + |
| 28 | + # Check if email already exists in MongoDB |
| 29 | + existing_user = User.objects(email=email).first() |
| 30 | + if existing_user: |
| 31 | + return {"error":'Email already registered. Please login or use a different email.'},409 |
| 32 | + |
| 33 | + if image_file: |
| 34 | + filename = secure_filename(str(uuid.uuid4()) + '.jpg') |
| 35 | + image_path = os.path.join(app.config['UPLOAD_FOLDER'],filename) |
| 36 | + with open(image_path, 'wb') as f: |
| 37 | + f.write(image_file.read()) |
| 38 | + image_url = filename |
| 39 | + else: |
| 40 | + image_url = None |
| 41 | + |
| 42 | + # Store user in MongoDB |
| 43 | + user = User(name=name, email=email, image=image_url, password= bcrypt.generate_password_hash(password).decode('utf-8')) |
| 44 | + user.save() |
| 45 | + return {"message":'Registration successful. Please login.'} |
| 46 | + |
| 47 | +# Login route |
| 48 | +@auth_bp.route('/login', methods=['POST']) |
| 49 | +def login(): |
| 50 | + # Get username and password from request data |
| 51 | + email = request.json['email'] |
| 52 | + password = request.json['password'] |
| 53 | + |
| 54 | + # Find the User in the database |
| 55 | + existing_user = User.objects(email=email).first() |
| 56 | + if existing_user and checkpw(password.encode('utf-8'), existing_user['password'].encode('utf-8')): |
| 57 | + status_code = 200 |
| 58 | + token = jwt.encode({'name': existing_user['name'],'email': email, 'image': existing_user['image'], 'uid': str(existing_user['id']),'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1)}, app.config['SECRET_KEY'] , algorithm='HS256') |
| 59 | + session['token'] = token |
| 60 | + response = {'message': 'Login successful', 'token':token} |
| 61 | + response = make_response(response) |
| 62 | + response.set_cookie('access_token',token) |
| 63 | + else: |
| 64 | + response = {'error': 'Invalid username or password'} |
| 65 | + status_code = 401 |
| 66 | + |
| 67 | + return response, status_code |
| 68 | + |
| 69 | +# Protected route |
| 70 | +@auth_bp.route('/protected') |
| 71 | +def protected(): |
| 72 | + # Verify JWT token |
| 73 | + token = request.headers.get('token') |
| 74 | + # print(token) |
| 75 | + # print(session.get('token')) |
| 76 | + if session.get('token') is None: |
| 77 | + return {'error':'Please Login to continue'},401 |
| 78 | + if token!=session['token']: |
| 79 | + return {'error': 'Invalid token'},401 |
| 80 | + if not token: |
| 81 | + return {'error': 'No token provided'},401 |
| 82 | + |
| 83 | + try: |
| 84 | + # Decode JWT token |
| 85 | + payload = jwt.decode(token, app.config['SECRET_KEY'], algorithms=['HS256']) |
| 86 | + email = payload['email'] |
| 87 | + name = payload['name'] |
| 88 | + uid = payload['uid'] |
| 89 | + image = payload['image'] |
| 90 | + return {'message': f'Welcome, {name}', 'email':email, 'name':name, 'uid': uid, 'image': image} |
| 91 | + except jwt.ExpiredSignatureError: |
| 92 | + return {'error': 'Token has expired'},401 |
| 93 | + except jwt.InvalidTokenError: |
| 94 | + return {'error': 'Invalid token'},401 |
| 95 | + |
| 96 | +@auth_bp.route('/users/<user_id>') |
| 97 | +def getUserById(user_id): |
| 98 | + user =User.objects(id=user_id).first() |
| 99 | + if not user: |
| 100 | + return jsonify({'error': 'user not found'}), 404 |
| 101 | + return jsonify(user.to_dict()), 200 |
| 102 | + |
| 103 | +@auth_bp.route('/users') |
| 104 | +def getAllUsers(): |
| 105 | + users = User.objects() |
| 106 | + return jsonify([user.to_dict() for user in users]), 200 |
| 107 | + |
| 108 | + |
| 109 | +# Logout route |
| 110 | +@app.route('/logout') |
| 111 | +def logout(): |
| 112 | + # Clear token from session |
| 113 | + session.pop('token', None) |
| 114 | + return {"message":'Logged out successfully.'} |
| 115 | + |
0 commit comments