52 lines
1.2 KiB
Python
52 lines
1.2 KiB
Python
"""Authentication routes."""
|
|
|
|
from flask import Blueprint, url_for
|
|
|
|
from app.services.auth_service import AuthService
|
|
|
|
bp = Blueprint("auth", __name__)
|
|
auth_service = AuthService()
|
|
|
|
|
|
@bp.route("/login")
|
|
def login() -> dict[str, str]:
|
|
"""Initiate Google OAuth login."""
|
|
redirect_uri = url_for("auth.callback", _external=True)
|
|
login_url = auth_service.get_login_url(redirect_uri)
|
|
return {"login_url": login_url}
|
|
|
|
|
|
@bp.route("/callback")
|
|
def callback():
|
|
"""Handle OAuth callback from Google."""
|
|
try:
|
|
user_data, response = auth_service.handle_callback()
|
|
return response
|
|
except Exception as e:
|
|
return {"error": str(e)}, 400
|
|
|
|
|
|
@bp.route("/logout")
|
|
def logout():
|
|
"""Logout current user."""
|
|
return auth_service.logout()
|
|
|
|
|
|
@bp.route("/me")
|
|
def me() -> dict[str, str] | tuple[dict[str, str], int]:
|
|
"""Get current user information."""
|
|
user = auth_service.get_current_user()
|
|
if not user:
|
|
return {"error": "Not authenticated"}, 401
|
|
|
|
return {"user": user}
|
|
|
|
|
|
@bp.route("/refresh")
|
|
def refresh():
|
|
"""Refresh access token using refresh token."""
|
|
response = auth_service.refresh_tokens()
|
|
if not response:
|
|
return {"error": "Invalid or expired refresh token"}, 401
|
|
|
|
return response |