feat: implement instance ID management and integrate with OAuth token exchange

This commit is contained in:
Junyan Qin
2025-12-29 00:35:31 +08:00
parent ba5b481617
commit de8a7df6c2
4 changed files with 26 additions and 1 deletions
+3 -1
View File
@@ -145,13 +145,15 @@ class UserService:
async def exchange_space_oauth_code(self, code: str) -> typing.Dict: async def exchange_space_oauth_code(self, code: str) -> typing.Dict:
"""Exchange OAuth authorization code for tokens""" """Exchange OAuth authorization code for tokens"""
from langbot.pkg.utils import constants
space_config = self._get_space_config() space_config = self._get_space_config()
space_url = space_config['url'] space_url = space_config['url']
async with aiohttp.ClientSession() as session: async with aiohttp.ClientSession() as session:
async with session.post( async with session.post(
f'{space_url}/api/v1/accounts/oauth/token', f'{space_url}/api/v1/accounts/oauth/token',
json={'code': code}, json={'code': code, 'instance_id': constants.instance_id},
) as response: ) as response:
if response.status != 200: if response.status != 200:
raise ValueError(f'Failed to exchange OAuth code: {await response.text()}') raise ValueError(f'Failed to exchange OAuth code: {await response.text()}')
+2
View File
@@ -76,6 +76,8 @@ class Application:
instance_config: config_mgr.ConfigManager = None instance_config: config_mgr.ConfigManager = None
instance_id: config_mgr.ConfigManager = None # used to identify the instance
# ======= Metadata config manager ======= # ======= Metadata config manager =======
sensitive_meta: config_mgr.ConfigManager = None sensitive_meta: config_mgr.ConfigManager = None
@@ -2,8 +2,11 @@ from __future__ import annotations
import os import os
from typing import Any from typing import Any
from langbot.pkg.utils import constants
import yaml import yaml
import importlib.resources as resources import importlib.resources as resources
import uuid
import time
from .. import stage, app from .. import stage, app
from ..bootutils import config from ..bootutils import config
@@ -142,6 +145,22 @@ class LoadConfigStage(stage.BootingStage):
await ap.instance_config.dump_config() await ap.instance_config.dump_config()
# load or generate instance id
ap.instance_id = await config.load_json_config(
'data/labels/instance_id.json',
template_data={
'instance_id': f'instance_{str(uuid.uuid4())}',
'instance_create_ts': int(time.time()),
},
completion=False,
)
constants.instance_id = ap.instance_id.data['instance_id']
print(f'LangBot instance id: {constants.instance_id}')
await ap.instance_id.dump_config()
ap.sensitive_meta = await config.load_json_config( ap.sensitive_meta = await config.load_json_config(
'data/metadata/sensitive-words.json', 'data/metadata/sensitive-words.json',
'metadata/sensitive-words.json', 'metadata/sensitive-words.json',
+2
View File
@@ -8,3 +8,5 @@ required_database_version = 16
debug_mode = False debug_mode = False
edition = 'community' edition = 'community'
instance_id = ''