mirror of
				https://github.com/langgenius/dify.git
				synced 2025-10-31 19:03:09 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			68 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import uuid
 | |
| 
 | |
| from flask import request
 | |
| from flask_restful import Resource
 | |
| from werkzeug.exceptions import NotFound, Unauthorized
 | |
| 
 | |
| from controllers.web import api
 | |
| from extensions.ext_database import db
 | |
| from libs.passport import PassportService
 | |
| from models.model import App, EndUser, Site
 | |
| 
 | |
| 
 | |
| class PassportResource(Resource):
 | |
|     """Base resource for passport."""
 | |
|     def get(self):
 | |
|         app_code = request.headers.get('X-App-Code')
 | |
|         if app_code is None:
 | |
|             raise Unauthorized('X-App-Code header is missing.')
 | |
| 
 | |
|         # get site from db and check if it is normal
 | |
|         site = db.session.query(Site).filter(
 | |
|             Site.code == app_code,
 | |
|             Site.status == 'normal'
 | |
|         ).first()
 | |
|         if not site:
 | |
|             raise NotFound()
 | |
|         # get app from db and check if it is normal and enable_site
 | |
|         app_model = db.session.query(App).filter(App.id == site.app_id).first()
 | |
|         if not app_model or app_model.status != 'normal' or not app_model.enable_site:
 | |
|             raise NotFound()
 | |
|         
 | |
|         end_user = EndUser(
 | |
|             tenant_id=app_model.tenant_id,
 | |
|             app_id=app_model.id,
 | |
|             type='browser',
 | |
|             is_anonymous=True,
 | |
|             session_id=generate_session_id(),
 | |
|         )
 | |
|         db.session.add(end_user)
 | |
|         db.session.commit()
 | |
| 
 | |
|         payload = {
 | |
|             "iss": site.app_id,
 | |
|             'sub': 'Web API Passport',
 | |
|             'app_id': site.app_id,
 | |
|             'app_code': app_code,
 | |
|             'end_user_id': end_user.id,
 | |
|         }
 | |
| 
 | |
|         tk = PassportService().issue(payload)
 | |
| 
 | |
|         return {
 | |
|             'access_token': tk,
 | |
|         }
 | |
| 
 | |
| api.add_resource(PassportResource, '/passport')
 | |
| 
 | |
| def generate_session_id():
 | |
|     """
 | |
|     Generate a unique session ID.
 | |
|     """
 | |
|     while True:
 | |
|         session_id = str(uuid.uuid4())
 | |
|         existing_count = db.session.query(EndUser) \
 | |
|             .filter(EndUser.session_id == session_id).count()
 | |
|         if existing_count == 0:
 | |
|             return session_id
 | 
