passport.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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 WebSSOAuthRequiredError
  7. from extensions.ext_database import db
  8. from libs.passport import PassportService
  9. from models.model import App, EndUser, Site
  10. from services.feature_service import FeatureService
  11. class PassportResource(Resource):
  12. """Base resource for passport."""
  13. def get(self):
  14. system_features = FeatureService.get_system_features()
  15. if system_features.sso_enforced_for_web:
  16. raise WebSSOAuthRequiredError()
  17. app_code = request.headers.get('X-App-Code')
  18. if app_code is None:
  19. raise Unauthorized('X-App-Code header is missing.')
  20. # get site from db and check if it is normal
  21. site = db.session.query(Site).filter(
  22. Site.code == app_code,
  23. Site.status == 'normal'
  24. ).first()
  25. if not site:
  26. raise NotFound()
  27. # get app from db and check if it is normal and enable_site
  28. app_model = db.session.query(App).filter(App.id == site.app_id).first()
  29. if not app_model or app_model.status != 'normal' or not app_model.enable_site:
  30. raise NotFound()
  31. end_user = EndUser(
  32. tenant_id=app_model.tenant_id,
  33. app_id=app_model.id,
  34. type='browser',
  35. is_anonymous=True,
  36. session_id=generate_session_id(),
  37. )
  38. db.session.add(end_user)
  39. db.session.commit()
  40. payload = {
  41. "iss": site.app_id,
  42. 'sub': 'Web API Passport',
  43. 'app_id': site.app_id,
  44. 'app_code': app_code,
  45. 'end_user_id': end_user.id,
  46. }
  47. tk = PassportService().issue(payload)
  48. return {
  49. 'access_token': tk,
  50. }
  51. api.add_resource(PassportResource, '/passport')
  52. def generate_session_id():
  53. """
  54. Generate a unique session ID.
  55. """
  56. while True:
  57. session_id = str(uuid.uuid4())
  58. existing_count = db.session.query(EndUser) \
  59. .filter(EndUser.session_id == session_id).count()
  60. if existing_count == 0:
  61. return session_id