from authlib.integrations.flask_client import OAuth, OAuthError from flask import Blueprint, url_for, jsonify, session from utils.user_utils import get_session_info_email oauth_bp = Blueprint("oauth", __name__) def init_oauth(app): oauth = OAuth(app) google = oauth.register( 'google', client_id=app.config['GOOGLE_CLIENT_ID'], client_secret=app.config['GOOGLE_CLIENT_SECRET'], authorize_url='https://accounts.google.com/o/oauth2/auth', authorize_params=None, access_token_url='https://accounts.google.com/o/oauth2/token', access_token_params=None, refresh_token_url=None, redirect_uri=url_for('google.google_auth', _external=True), scope='openid profile email', ) @oauth_bp.route('/login/google') def login_google(): """ Redirects to Google's OAuth authorization page """ return google.authorize_redirect(url_for('google.google_auth', _external=True)) @oauth_bp.route('/google_auth') def google_auth(): try: token = google.authorize_access_token() user = google.parse_id_token(token) # check if email exists else create a database entry user_email = user.get("email") user_data = get_session_info_email(user_email) session.clear() session["username"] = user_data["username"] session["user_id"] = user_data["user_id"] return jsonify({ 'message': 'User authenticated successfully', }) except OAuthError as e: # Handle OAuth errors like failed authentication or invalid token return jsonify({ 'message': 'Authentication failed', 'error': str(e) }), 400 except Exception as e: # Handle other unexpected errors return jsonify({ 'message': 'An unexpected error occurred', 'error': str(e) }), 500