e5bab51f98020c4ff0276ae066f121257cd89403
Office 365 Self Service
基于 Microsoft Graph API 实现的 Office 365 账号自助开通系统。通过兑换码自助开通账号,每个兑换码只能开通一个账号。
功能特性
- 兑换码管理:管理员后台批量生成兑换码
- 自助开通:用户输入兑换码和用户名自助开通 Office 365 账号
- 自动授权:账号开通时自动分配许可证
- 兑换记录:后台记录兑换码与已开通账号的对应关系
项目结构
.
├── app.py # 应用入口
├── Dockerfile # Docker 镜像构建
├── docker-compose.yml # Docker Compose 部署
├── requirements.txt # Python 依赖
├── .env.example # 配置示例
├── office365_self_service/
│ ├── __init__.py # Flask 应用工厂
│ ├── settings.py # 配置加载
│ ├── routes.py # 路由定义
│ ├── models.py # 数据库模型
│ ├── services.py # Office 365 服务
│ ├── graph.py # Graph API 客户端
│ └── templates/ # 前端模板
│ ├── admin_login.html # 管理员登录
│ ├── admin_dashboard.html # 管理后台
│ └── user_redemption.html # 用户兑换页面
部署方式
本地运行
# 1. 创建虚拟环境并安装依赖
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# 2. 复制配置文件
cp .env.example .env
# 3. 在 .env 中填写配置(见下方参数说明)
# 4. 启动服务
python3 app.py
Docker Compose 部署
# 1. 复制配置文件并配置
cp .env.example .env
# 2. 构建并启动
docker compose up -d --build
# 3. 查看日志
docker compose logs -f
# 4. 停止服务
docker compose down
默认端口:8000
环境变量参数说明
| 参数名 | 必填 | 说明 | 获取方式 |
|---|---|---|---|
CLIENT_ID |
是 | Entra 应用客户端 ID | Azure AD 应用注册概览页 |
TENANT_ID |
是 | 租户 ID | Azure AD 应用注册概览页 |
CLIENT_SECRET |
是 | 应用客户端密钥 | Azure AD -> 证书和密码 |
DEFAULT_PASSWORD |
是 | 新建账号默认密码 | 自定义高强度密码 |
DEFAULT_DOMAIN |
建议 | 默认域名 | 例如 yourtenant.onmicrosoft.com |
DEFAULT_LICENSE_SKU |
可选 | 默认许可证 SKU | 例如 ENTERPRISEPACK、M365_BUSINESS_PREMIUM |
DEFAULT_USAGE_LOCATION |
建议 | 默认使用地区 | 国际版常用:US、SG、JP |
WEB_AUTH_ENABLED |
可选 | 后台登录保护 | true 或 false |
ADMIN_USERNAME |
建议 | 后台登录用户名 | 自定义 |
ADMIN_PASSWORD |
建议 | 后台登录密码 | 自定义 |
SESSION_SECRET |
建议 | Flask 会话密钥 | 随机长字符串 |
HOST |
可选 | 服务监听地址 | 默认 0.0.0.0 |
PORT |
可选 | 服务监听端口 | 默认 8000 |
DEBUG |
可选 | 调试模式 | 默认 false |
Entra ID (Azure AD) 应用配置
-
创建应用注册
- 登录 Microsoft Entra 管理中心
- 导航到
身份->应用注册->+ 新建注册 - 填写名称(例如
Office 365 Self Service) - 选择「仅此组织目录中的帐户」
- 不需要填写重定向 URI
- 点击「注册」
-
获取应用信息
- 复制「应用程序(客户端) ID」→
CLIENT_ID - 复制「目录(租户) ID」→
TENANT_ID
- 复制「应用程序(客户端) ID」→
-
创建客户端密钥
- 导航到「证书和密码」
- 点击「+ 新建客户端密码」
- 设置描述和过期时间
- 点击「添加」后复制密钥值 →
CLIENT_SECRET
-
配置 API 权限
- 导航到「API 权限」
- 点击「+ 添加权限」-> 「Microsoft Graph」-> 「应用程序权限」
- 添加以下权限:
User.ReadWrite.All- 读取和写入用户User-PasswordProfile.ReadWrite.All- 密码配置LicenseAssignment.ReadWrite.All- 许可证分配
- 点击「为 xx 授予管理员同意」
使用说明
管理员后台
访问地址:http://ip:port/admin/
- 使用设置的 admin 账号登录
- 点击「生成兑换码」批量生成兑换码
- 可以查看所有兑换码及兑换记录
用户自助开通
访问地址:http://ip:port/
- 输入管理员提供的兑换码
- 输入想要的用户名(不需要加域名)
- 点击「立即开通」
- 系统返回临时密码,首次登录后需更改密码
技术栈
- Python 3.9+
- Flask + Flask-SQLAlchemy
- Microsoft Graph API
- SQLite(数据持久化)
- Docker
注意事项
DEFAULT_LICENSE_SKU必须是租户中实际存在的 SKU 名称- 兑换码使用后立即失效,无法重复使用
- 生产环境建议使用
DEBUG=false并配置反向代理
Description
Languages
Python
63.1%
HTML
36.7%
Dockerfile
0.2%