| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 | 
							- import base64
 
- import hashlib
 
- import hmac
 
- import os
 
- import time
 
- from pydantic import BaseModel, Field
 
- from configs import dify_config
 
- class SignedUrlParams(BaseModel):
 
-     sign_key: str = Field(..., description="The sign key")
 
-     timestamp: str = Field(..., description="Timestamp")
 
-     nonce: str = Field(..., description="Nonce")
 
-     sign: str = Field(..., description="Signature")
 
- class UrlSigner:
 
-     @classmethod
 
-     def get_signed_url(cls, url: str, sign_key: str, prefix: str) -> str:
 
-         signed_url_params = cls.get_signed_url_params(sign_key, prefix)
 
-         return (
 
-             f"{url}?timestamp={signed_url_params.timestamp}"
 
-             f"&nonce={signed_url_params.nonce}&sign={signed_url_params.sign}"
 
-         )
 
-     @classmethod
 
-     def get_signed_url_params(cls, sign_key: str, prefix: str) -> SignedUrlParams:
 
-         timestamp = str(int(time.time()))
 
-         nonce = os.urandom(16).hex()
 
-         sign = cls._sign(sign_key, timestamp, nonce, prefix)
 
-         return SignedUrlParams(sign_key=sign_key, timestamp=timestamp, nonce=nonce, sign=sign)
 
-     @classmethod
 
-     def verify(cls, sign_key: str, timestamp: str, nonce: str, sign: str, prefix: str) -> bool:
 
-         recalculated_sign = cls._sign(sign_key, timestamp, nonce, prefix)
 
-         return sign == recalculated_sign
 
-     @classmethod
 
-     def _sign(cls, sign_key: str, timestamp: str, nonce: str, prefix: str) -> str:
 
-         if not dify_config.SECRET_KEY:
 
-             raise Exception("SECRET_KEY is not set")
 
-         data_to_sign = f"{prefix}|{sign_key}|{timestamp}|{nonce}"
 
-         secret_key = dify_config.SECRET_KEY.encode()
 
-         sign = hmac.new(secret_key, data_to_sign.encode(), hashlib.sha256).digest()
 
-         encoded_sign = base64.urlsafe_b64encode(sign).decode()
 
-         return encoded_sign
 
 
  |