返回提交历史
Modified
g4f/api/__init__.py
+11
-5
Modified
g4f/gui/server/backend_api.py
+2
-2
Modified
g4f/gui/server/crypto.py
+9
-0
XFEstudio/gpt4free
Add public gen api
a31cb50d
代码差异
3 个文件
+22
-7
@@ -82,7 +82,7 @@ from .stubs import (
82
82
from g4f import debug
83
83
84
84
try:
85
from g4f.gui.server.crypto import create_or_read_keys, decrypt_data
85
from g4f.gui.server.crypto import create_or_read_keys, decrypt_data, get_session_key
86
86
has_crypto = True
87
87
except ImportError:
88
88
has_crypto = False
@@ -217,6 +217,7 @@ class Api:
217
217
print(f"Register authentication key: {''.join(['*' for _ in range(len(AppConfig.g4f_api_key))])}")
218
218
if has_crypto:
219
219
private_key, _ = create_or_read_keys()
220
session_key = get_session_key()
220
221
@self.app.middleware("http")
221
222
async def authorization(request: Request, call_next):
222
223
if AppConfig.g4f_api_key is not None or AppConfig.demo:
@@ -231,10 +232,15 @@ class Api:
231
232
if has_crypto and user_g4f_api_key:
232
233
try:
233
234
expires, user = decrypt_data(private_key, user_g4f_api_key).split(":", 1)
234
expires = int(expires) - int(time.time())
235
debug.log(f"User: '{user}' G4F API key expires in {expires} seconds")
236
except Exception as e:
237
return ErrorResponse.from_message(f"Invalid G4F API key: {e}", HTTP_401_UNAUTHORIZED)
235
except:
236
try:
237
data = json.loads(decrypt_data(session_key, user_g4f_api_key))
238
expires = int(decrypt_data(private_key, data["data"])) + 86400
239
user = data.get("user", None)
240
except:
241
return ErrorResponse.from_message(f"Invalid G4F API key", HTTP_401_UNAUTHORIZED)
242
expires = int(expires) - int(time.time())
243
debug.log(f"User: '{user}' G4F API key expires in {expires} seconds")
238
244
if expires < 0:
239
245
return ErrorResponse.from_message("G4F API key expired", HTTP_401_UNAUTHORIZED)
240
246
else:
@@ -29,7 +29,7 @@ try:
29
29
except ImportError as e:
30
30
has_markitdown = False
31
31
try:
32
from .crypto import rsa, serialization, create_or_read_keys, decrypt_data, encrypt_data
32
from .crypto import rsa, serialization, create_or_read_keys, decrypt_data, encrypt_data, get_session_key
33
33
has_crypto = True
34
34
except ImportError:
35
35
has_crypto = False
@@ -79,7 +79,7 @@ class Backend_Api(Api):
79
79
self.chat_cache = {}
80
80
81
81
if has_crypto:
82
private_key_obj = rsa.generate_private_key(public_exponent=65537, key_size=4096)
82
private_key_obj = get_session_key()
83
83
public_key_obj = private_key_obj.public_key()
84
84
public_key_pem = public_key_obj.public_bytes(
85
85
encoding=serialization.Encoding.PEM,
@@ -9,6 +9,15 @@ from cryptography.hazmat.primitives.asymmetric.rsa import RSAPublicKey, RSAPriva
9
9
10
10
from ...cookies import get_cookies_dir
11
11
12
SESSION_KEY: RSAPrivateKey = None
13
14
def get_session_key() -> RSAPrivateKey:
15
global SESSION_KEY
16
if SESSION_KEY is not None:
17
return SESSION_KEY
18
SESSION_KEY = rsa.generate_private_key(public_exponent=65537, key_size=4096)
19
return SESSION_KEY
20
12
21
def create_or_read_keys() -> tuple[RSAPrivateKey, RSAPublicKey]:
13
22
private_key_file = os.path.join(get_cookies_dir(), "private_key.pem")
14
23
public_key_file = os.path.join(get_cookies_dir(), "public_key.pem")