ext_login.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import json
  2. import flask_login
  3. from flask import Response, request
  4. from flask_login import user_loaded_from_request, user_logged_in
  5. from werkzeug.exceptions import Unauthorized
  6. import contexts
  7. from dify_app import DifyApp
  8. from libs.passport import PassportService
  9. from services.account_service import AccountService
  10. login_manager = flask_login.LoginManager()
  11. # Flask-Login configuration
  12. @login_manager.request_loader
  13. def load_user_from_request(request_from_flask_login):
  14. """Load user based on the request."""
  15. if request.blueprint not in {"console", "inner_api"}:
  16. return None
  17. # Check if the user_id contains a dot, indicating the old format
  18. auth_header = request.headers.get("Authorization", "")
  19. if not auth_header:
  20. auth_token = request.args.get("_token")
  21. if not auth_token:
  22. raise Unauthorized("Invalid Authorization token.")
  23. else:
  24. if " " not in auth_header:
  25. raise Unauthorized("Invalid Authorization header format. Expected 'Bearer <api-key>' format.")
  26. auth_scheme, auth_token = auth_header.split(None, 1)
  27. auth_scheme = auth_scheme.lower()
  28. if auth_scheme != "bearer":
  29. raise Unauthorized("Invalid Authorization header format. Expected 'Bearer <api-key>' format.")
  30. decoded = PassportService().verify(auth_token)
  31. user_id = decoded.get("user_id")
  32. logged_in_account = AccountService.load_logged_in_account(account_id=user_id)
  33. return logged_in_account
  34. @user_logged_in.connect
  35. @user_loaded_from_request.connect
  36. def on_user_logged_in(_sender, user):
  37. """Called when a user logged in."""
  38. if user:
  39. contexts.tenant_id.set(user.current_tenant_id)
  40. @login_manager.unauthorized_handler
  41. def unauthorized_handler():
  42. """Handle unauthorized requests."""
  43. return Response(
  44. json.dumps({"code": "unauthorized", "message": "Unauthorized."}),
  45. status=401,
  46. content_type="application/json",
  47. )
  48. def init_app(app: DifyApp):
  49. login_manager.init_app(app)