passport.py 2.0 KB

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