passport.py 1.9 KB

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