You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

http_request.py 2.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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.exceptions.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. if sign_str:
  53. sign_str += ts
  54. return sign_str
  55. def get_access_token(self, force_refresh=False):
  56. current_time = time.time()
  57. if self.token and not force_refresh and self.token_expire_time > current_time:
  58. return self.token
  59. params = {"username": self.username, "password": self.password}
  60. url = "http://" + self.server + "/nacos/v1/auth/login"
  61. try:
  62. resp = requests.request("POST", url, headers=None, params=params)
  63. resp.raise_for_status()
  64. response_data = resp.json()
  65. self.token = response_data.get("accessToken")
  66. self.token_ttl = response_data.get("tokenTtl", 18000)
  67. self.token_expire_time = current_time + self.token_ttl - 10
  68. except Exception as e:
  69. logger.exception("[get-access-token] exception occur")
  70. raise