60 lines
2.1 KiB
Python
60 lines
2.1 KiB
Python
from authlib.integrations.flask_client import OAuth, OAuthError
|
|
from flask import Blueprint, url_for, jsonify, session
|
|
from blueprints.user 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 |