Files
WonderQ-Admin/app/config.py
duanshuwen bac68842ef feat(auth): add wechat miniapp customer phone login
Implement Wechat Mini Program phone number login flow for end customers:
- add PhoneLoginIn Pydantic request schema
- create wechat.py module for Wechat API interactions and phone code exchange
- add customer JWT utilities and require_customer authentication dependency
- add new public API endpoints: /api/public/auth/phone-login and /api/public/auth/me
- add required environment config variables and update example .env
- add comprehensive test cases for the new auth flow and endpoints
2026-07-08 16:11:34 +08:00

37 lines
1.6 KiB
Python

from functools import lru_cache
from urllib.parse import parse_qsl, urlencode, urlsplit, urlunsplit
from pydantic import Field
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
database_url: str = Field(default="postgresql://miniapp:miniapp_dev_password@localhost:5433/miniapp")
jwt_secret: str = Field(default="dev-only-change-me-before-production")
jwt_expires_hours: int = Field(default=8)
log_level: str = Field(default="info")
port: int = Field(default=4000)
cors_origins: str = Field(default="*")
oss_access_key_id: str | None = Field(default=None)
oss_access_key_secret: str | None = Field(default=None)
oss_endpoint: str | None = Field(default=None)
oss_bucket_name: str | None = Field(default=None)
wechat_miniapp_appid: str | None = Field(default=None)
wechat_miniapp_secret: str | None = Field(default=None)
customer_jwt_expires_hours: int = Field(default=720)
model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore")
@property
def sqlalchemy_url(self) -> str:
parsed = urlsplit(self.database_url)
query = urlencode([(key, value) for key, value in parse_qsl(parsed.query, keep_blank_values=True) if key != "schema"])
normalized = urlunsplit((parsed.scheme, parsed.netloc, parsed.path, query, parsed.fragment))
if normalized.startswith("postgresql://"):
return normalized.replace("postgresql://", "postgresql+psycopg://", 1)
return normalized
@lru_cache
def get_settings() -> Settings:
return Settings()