Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

passport.py 3.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import uuid
  2. from flask import request
  3. from flask_restful import Resource
  4. from werkzeug.exceptions import NotFound, Unauthorized
  5. from controllers.web import api
  6. from controllers.web.error import WebAppAuthRequiredError
  7. from extensions.ext_database import db
  8. from libs.passport import PassportService
  9. from models.model import App, EndUser, Site
  10. from services.enterprise.enterprise_service import EnterpriseService
  11. from services.feature_service import FeatureService
  12. class PassportResource(Resource):
  13. """Base resource for passport."""
  14. def get(self):
  15. system_features = FeatureService.get_system_features()
  16. app_code = request.headers.get("X-App-Code")
  17. user_id = request.args.get("user_id")
  18. if app_code is None:
  19. raise Unauthorized("X-App-Code header is missing.")
  20. if system_features.webapp_auth.enabled:
  21. app_settings = EnterpriseService.WebAppAuth.get_app_access_mode_by_code(app_code=app_code)
  22. if not app_settings or not app_settings.access_mode == "public":
  23. raise WebAppAuthRequiredError()
  24. # get site from db and check if it is normal
  25. site = db.session.query(Site).filter(Site.code == app_code, Site.status == "normal").first()
  26. if not site:
  27. raise NotFound()
  28. # get app from db and check if it is normal and enable_site
  29. app_model = db.session.query(App).filter(App.id == site.app_id).first()
  30. if not app_model or app_model.status != "normal" or not app_model.enable_site:
  31. raise NotFound()
  32. if user_id:
  33. end_user = (
  34. db.session.query(EndUser).filter(EndUser.app_id == app_model.id, EndUser.session_id == user_id).first()
  35. )
  36. if end_user:
  37. pass
  38. else:
  39. end_user = EndUser(
  40. tenant_id=app_model.tenant_id,
  41. app_id=app_model.id,
  42. type="browser",
  43. is_anonymous=True,
  44. session_id=user_id,
  45. )
  46. db.session.add(end_user)
  47. db.session.commit()
  48. else:
  49. end_user = EndUser(
  50. tenant_id=app_model.tenant_id,
  51. app_id=app_model.id,
  52. type="browser",
  53. is_anonymous=True,
  54. session_id=generate_session_id(),
  55. )
  56. db.session.add(end_user)
  57. db.session.commit()
  58. payload = {
  59. "iss": site.app_id,
  60. "sub": "Web API Passport",
  61. "app_id": site.app_id,
  62. "app_code": app_code,
  63. "end_user_id": end_user.id,
  64. }
  65. tk = PassportService().issue(payload)
  66. return {
  67. "access_token": tk,
  68. }
  69. api.add_resource(PassportResource, "/passport")
  70. def generate_session_id():
  71. """
  72. Generate a unique session ID.
  73. """
  74. while True:
  75. session_id = str(uuid.uuid4())
  76. existing_count = db.session.query(EndUser).filter(EndUser.session_id == session_id).count()
  77. if existing_count == 0:
  78. return session_id