Skip to main content

FastAPI auth: register, login (JWT), QQ/WeChat/phone binding

Project description

funlogin

用户注册、登录(JWT)、QQ/微信/手机绑定的 FastAPI 公共包。

安装

pip install -e .
# 或
uv pip install -e .

配置

通过环境变量(前缀 FUNLOGIN_)或 .env 配置:

变量 说明 默认
FUNLOGIN_DATABASE_URL 数据库连接 sqlite+aiosqlite:///./funlogin.db
FUNLOGIN_JWT_SECRET JWT 密钥 change-me-in-production
FUNLOGIN_JWT_ALGORITHM JWT 算法 HS256
FUNLOGIN_JWT_ACCESS_EXPIRE Access Token 过期秒数 3600
FUNLOGIN_JWT_REFRESH_EXPIRE Refresh Token 过期秒数 604800
FUNLOGIN_QQ_APP_ID QQ 互联 AppID
FUNLOGIN_QQ_APP_KEY QQ 互联 AppKey
FUNLOGIN_WECHAT_APP_ID 微信开放平台 AppID
FUNLOGIN_WECHAT_APP_SECRET 微信开放平台 Secret
FUNLOGIN_ALIYUN_ACCESS_KEY 阿里云 AccessKey
FUNLOGIN_ALIYUN_SECRET 阿里云 Secret
FUNLOGIN_ALIYUN_SMS_SIGN 短信签名
FUNLOGIN_ALIYUN_SMS_TEMPLATE 短信模板

快速集成

from fastapi import FastAPI
from funlogin import router

app = FastAPI()
app.include_router(router, prefix="/api")

# 运行: uvicorn your_app:app

API 接口(三方调用参考)

挂载后基础路径为 /api,以下接口均已联调通过。

统一响应格式:

{"code": 0, "data": {...}, "message": "ok"}
code 含义
0 成功
40001 业务错误(如用户名已存在)
40101 未登录 / Token 无效
40102 Token 已过期
40301 禁止访问
50001 服务端内部错误

需登录接口:请求头加 Authorization: Bearer <access_token>


认证 Auth

方法 路径 请求体 响应 data 示例
POST /api/auth/send-code {"phone": "13800138000"}
POST /api/auth/register {"username": "alice", "password": "123456"}{"email": "a@x.com", "password": "p"}{"phone": "138...", "code": "123456"} {"user_id": 1}
POST /api/auth/login 同 register,二选一 {"access_token": "...", "refresh_token": "..."}
GET /api/auth/me 无(需 JWT) {"user_id": 1, "role": 1, "username": "alice", "email": null, "phone": null, "created_at": "...", "updated_at": "..."}
POST /api/auth/refresh {"refresh_token": "..."} {"access_token": "...", "refresh_token": "..."}
PATCH /api/auth/role {"role": 1}(需 JWT) {"user_id": 1, "role": 1}

绑定 Bind(需 JWT)

方法 路径 请求体 / 参数 响应 data 示例
POST /api/bind/phone/send-code {"phone": "13800138000"}
POST /api/bind/phone {"phone": "138...", "code": "123456"}
GET /api/bind/qq/authorize Query: redirect_uri=https://... {"url": "...", "state": "..."}
POST /api/bind/qq/callback {"code": "...", "redirect_uri": "..."}
GET /api/bind/wechat/authorize Query: redirect_uri=https://... {"url": "...", "state": "..."}
POST /api/bind/wechat/callback {"code": "..."}
GET /api/bind/list {"phone": ["138..."], "qq": [...], "wechat": [...]}

完整 OpenAPI 3.1 描述见 docs/openapi.json,可用于生成客户端或 Mock。

数据库

示例应用启动时会自动创建表。若自行集成,在应用启动时调用一次 await funlogin.core.database.init_db() 即可建表。

User 表 role 字段int 类型,默认 1,由使用方定义枚举值(如 1=普通用户、2=管理员),用于权限控制。若升级前已有数据库,需删库重建或手动 ALTER TABLE users ADD COLUMN role INTEGER DEFAULT 1

开发

pip install -e ".[test]"
pytest -v

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

funlogin-1.0.9-py3-none-any.whl (17.7 kB view details)

Uploaded Python 3

File details

Details for the file funlogin-1.0.9-py3-none-any.whl.

File metadata

  • Download URL: funlogin-1.0.9-py3-none-any.whl
  • Upload date:
  • Size: 17.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.2

File hashes

Hashes for funlogin-1.0.9-py3-none-any.whl
Algorithm Hash digest
SHA256 0d8485112cf34c460dd306c6a91927e3b98bc5fba0bf45c6117fb6c701411421
MD5 fb2c433af8f4ebd47a88c57e4776e8e8
BLAKE2b-256 4577c3dc74c6c0822fea656f276abf65a3d8cb377e6cae81e208bc306b46a2f5

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page