Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

http_request.py 3.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import base64
  2. import hashlib
  3. import hmac
  4. import logging
  5. import os
  6. import time
  7. import requests
  8. logger = logging.getLogger(__name__)
  9. class NacosHttpClient:
  10. def __init__(self):
  11. self.username = os.getenv("DIFY_ENV_NACOS_USERNAME")
  12. self.password = os.getenv("DIFY_ENV_NACOS_PASSWORD")
  13. self.ak = os.getenv("DIFY_ENV_NACOS_ACCESS_KEY")
  14. self.sk = os.getenv("DIFY_ENV_NACOS_SECRET_KEY")
  15. self.server = os.getenv("DIFY_ENV_NACOS_SERVER_ADDR", "localhost:8848")
  16. self.token = None
  17. self.token_ttl = 18000
  18. self.token_expire_time: float = 0
  19. def http_request(self, url, method="GET", headers=None, params=None):
  20. try:
  21. self._inject_auth_info(headers, params)
  22. response = requests.request(method, url="http://" + self.server + url, headers=headers, params=params)
  23. response.raise_for_status()
  24. return response.text
  25. except requests.RequestException as e:
  26. return f"Request to Nacos failed: {e}"
  27. def _inject_auth_info(self, headers, params, module="config"):
  28. headers.update({"User-Agent": "Nacos-Http-Client-In-Dify:v0.0.1"})
  29. if module == "login":
  30. return
  31. ts = str(int(time.time() * 1000))
  32. if self.ak and self.sk:
  33. sign_str = self.get_sign_str(params["group"], params["tenant"], ts)
  34. headers["Spas-AccessKey"] = self.ak
  35. headers["Spas-Signature"] = self.__do_sign(sign_str, self.sk)
  36. headers["timeStamp"] = ts
  37. if self.username and self.password:
  38. self.get_access_token(force_refresh=False)
  39. params["accessToken"] = self.token
  40. def __do_sign(self, sign_str, sk):
  41. return (
  42. base64.encodebytes(hmac.new(sk.encode(), sign_str.encode(), digestmod=hashlib.sha1).digest())
  43. .decode()
  44. .strip()
  45. )
  46. def get_sign_str(self, group, tenant, ts):
  47. sign_str = ""
  48. if tenant:
  49. sign_str = tenant + "+"
  50. if group:
  51. sign_str = sign_str + group + "+"
  52. sign_str += ts # Directly concatenate ts without conditional checks, because the nacos auth header forced it.
  53. return sign_str
  54. def get_access_token(self, force_refresh=False):
  55. current_time = time.time()
  56. if self.token and not force_refresh and self.token_expire_time > current_time:
  57. return self.token
  58. params = {"username": self.username, "password": self.password}
  59. url = "http://" + self.server + "/nacos/v1/auth/login"
  60. try:
  61. resp = requests.request("POST", url, headers=None, params=params)
  62. resp.raise_for_status()
  63. response_data = resp.json()
  64. self.token = response_data.get("accessToken")
  65. self.token_ttl = response_data.get("tokenTtl", 18000)
  66. self.token_expire_time = current_time + self.token_ttl - 10
  67. except Exception as e:
  68. logger.exception("[get-access-token] exception occur")
  69. raise