ChatLogin · 交互演示

登录体验与接入示例

复用认证、会话与登录界面。先体验登录效果,再选择模板、复制接入代码。

每种方式都可选择演示用户 A / B;登录后实测本人数据与跨用户拒绝。仅合成数据,不连接真实业务库。

LIVE LOGIN LAB

四种后端的登录体验

四种真实后端,每例都有 A/B 用户。身份与会话由 ChatLogin 管理;业务数据由宿主按 user_id / owner_id 校验。

默认界面

固定账号登录

PasswordBackend

两个独立账号与密码哈希,使用默认 LoginUI。

体验固定账号 →

自定义界面

同步回调接入

CallbackBackend

本地同步回调 + 完整宿主 renderer。

体验宿主覆盖 →

HEADLESS

异步回调接入

AsyncCallbackBackend

本地异步回调 + 自有 HTML / JS。

体验 Headless →

账户库兼容

ChatVoice 接入

ChatVoiceAuth

在内存账户库里演示 A/B 登录,保留既有 ChatVoice schema。

体验 ChatVoice →

CAPABILITY MAP

先选后端,再独立选择前端

色板和布局是视觉配置,不是新的认证方式。

01

账户 / 凭据后端

PasswordBackend
CallbackBackend
AsyncCallbackBackend
ChatVoiceAuth

已实现:显式账号、宿主回调与精确旧 schema。
02

前端接入

LoginUI
宿主 template / renderer
ui=None headless

三种模式都调用同一真实 HTTP 安全契约。
03

会话存储

MemorySessionStore
SQLiteSessionStore
宿主 SessionStore

这是存储维度,不是认证协议。
04

授权边界

current_user
csrf_user
roles / require_owner

业务资源策略继续由宿主明确负责。

QUICK INTEGRATION

FastAPI 默认 UI:完整最小应用

安装 ChatLogin[web] 和宿主 ASGI server;下面的程序只从环境变量读取宿主显式设置的密码,没有默认生产凭据。

展开完整 FastAPI 示例
"""Minimal host app; provide an explicit password through the environment."""
import os
from urllib.parse import urlsplit

from fastapi import Depends, FastAPI
import uvicorn
from chatlogin import MemorySessionStore, PasswordBackend, Principal, SessionManager, hash_password
from chatlogin.fastapi import CookieSettings, FastAPIAuth
from chatlogin.ui import LoginUI

origin = os.environ.get("MY_SITE_ORIGIN", "http://127.0.0.1:8000")
password = os.environ["MY_SITE_LOGIN_PASSWORD"]
backend = PasswordBackend({
    "operator": (Principal("operator", "Operator"), hash_password(password)),
})
app = FastAPI()
auth = FastAPIAuth(
    backend,
    SessionManager(MemorySessionStore(max_sessions=256), instance="my-site", ttl=3600),
    origin=origin,
    ui=LoginUI(),
    cookie=CookieSettings(secure=urlsplit(origin).scheme == "https"),
)
app.include_router(auth.router)

@app.get("/")
def home():
    return {"login": "/auth/?next=/private"}

@app.get("/private")
def private(user=Depends(auth.current_user)):
    return user.as_dict()

if __name__ == "__main__":
    uvicorn.run(app, host="127.0.0.1", port=8000, proxy_headers=False)

HONEST BOUNDARIES

演示站不是生产登录微服务

它没有默认生产凭据,不读取 ChatEnv profile,不信任 forwarded headers,也不提供 OAuth、SSO、MFA、邮件、短信或扫码登录。生产宿主必须选择自己的后端、持久 store、固定 origin、TLS 与业务授权。