OpenLark 认证服务模块
🏗️ 相对路径:
crates/openlark-auth/📦 Crate类型: 认证服务核心模块 🎯 职责: 提供飞书开放平台的完整认证服务 📊 覆盖率: 🟢 80%
模块职责
openlark-auth 是 OpenLark SDK 的认证服务核心模块,基于 Project-Version-Resource (PVR) 架构设计,提供飞书开放平台的完整认证功能:
- 企业应用认证: 自建应用和商店应用的认证管理
- 用户身份认证: 用户访问令牌、信息验证和 OIDC 认证
- OAuth 授权: 标准化的 OAuth 授权流程
- 令牌管理: 自动化的令牌生命周期管理
- 类型安全: 完全的类型安全和编译时检查
架构设计
PVR 三层架构
graph TD
A[openlark-auth] --> B[models/]
A --> C[auth/]
A --> D[authen/]
A --> E[oauth/]
B --> B1[AuthConfig]
B --> B2[AuthError]
B --> B3[TokenInfo]
B --> B4[UserInfo]
C --> C1[Project: auth]
C1 --> C11[Version: v3]
C11 --> C111[Resource: tenant_access_token]
C11 --> C112[Resource: app_access_token]
C11 --> C113[Resource: app_ticket]
D --> D1[Project: authen]
D1 --> D11[Version: v1]
D11 --> D111[Resource: user_info]
D11 --> D112[Resource: oidc]
D11 --> D113[Resource: access_token]
E --> E1[Project: oauth]
E1 --> E11[Version: old]
E11 --> E111[Resource: authorization]
核心组件
// 认证服务统一入口
use ;
let config = new
.with_base_url;
let auth = new;
// 访问各个项目
let tenant_token = auth.auth.v3.tenant_access_token.internal.send.await?;
let user_info = auth.authen.v1.user_info.get.user_access_token.send.await?;
let oauth_url = auth.oauth.old.authorization.get_index.app_id.send.await?;
快速开始
安装依赖
[]
= { = "0.1.0-dev" }
= { = "1.0", = ["full"] }
基础使用
use ;
async
API 详细说明
企业应用认证 (auth/v3)
租户访问令牌
// 自建应用租户访问令牌
let tenant_token = auth.auth.v3.tenant_access_token
.internal
.send
.await?;
// 商店应用租户访问令牌
let tenant_token = auth.auth.v3.tenant_access_token
.store
.app_access_token
.tenant_key
.send
.await?;
应用访问令牌
// 自建应用访问令牌
let app_token = auth.auth.v3.app_access_token
.internal
.send
.await?;
// 商店应用访问令牌
let app_token = auth.auth.v3.app_access_token
.store
.send
.await?;
应用票据管理
// 重新推送应用票据
let response = auth.auth.v3.app_ticket
.resend
.send
.await?;
用户身份认证 (authen/v1)
用户信息获取
let user_info = auth.authen.v1.user_info
.get
.user_access_token
.user_id_type
.send
.await?;
用户访问令牌
// 使用授权码获取访问令牌
let access_token = auth.authen.v1.access_token
.create
.grant_type
.code
.send
.await?;
OIDC 认证
// 刷新 OIDC 访问令牌
let oidc_token = auth.authen.v1.oidc
.create_refresh_access_token
.refresh_token
.grant_type
.send
.await?;
OAuth 授权 (oauth/old)
获取预授权码
let pre_auth_code = auth.oauth.old.authorization
.get_index
.app_id
.redirect_uri
.scope
.state
.send
.await?;
数据模型
认证配置 (AuthConfig)
let config = new
.with_base_url;
// 或者使用默认配置
let default_config = default;
令牌信息 (TokenInfo)
let token_info = TokenInfo ;
// 令牌状态检查
assert!;
assert!;
assert!; // 30分钟内不需要刷新
用户信息 (UserInfo)
// 响应字段包括:
// 用户身份信息
// - open_id: 用户Open ID(应用级别)
// - union_id: 用户Union ID(跨应用)
// - user_id: 用户ID(系统内部)
//
// 基本信息
// - name: 用户姓名
// - en_name: 用户英文名/昵称
//
// 联系方式
// - email: 用户个人邮箱地址
// - enterprise_email: 用户企业邮箱地址
// - mobile: 用户手机号码
//
// 头像信息
// - avatar_url: 用户头像URL(单一链接)
// - avatar: 用户头像对象(多尺寸)
// - avatar_72: 72x72像素头像
// - avatar_240: 240x240像素头像
// - avatar_640: 640x640像素头像
// - avatar_origin: 原始尺寸头像
//
// 组织信息
// - tenant_key: 租户密钥
// - employee_no: 员工工号
// - department_ids: 用户所属部门ID列表
// - group_ids: 用户所属群组ID列表
// - positions: 用户职位信息列表
//
// 状态信息
// - status: 用户状态对象
// - is_activated: 是否已激活
// - is_joined: 是否已加入企业
// - is_reserved: 是否为预留用户
// - is_exited: 是否已离职
//
// 扩展信息
// - dingtalk_user_id: 钉钉用户ID
// - enterprise_extension: 企业扩展属性对象
// - custom_attrs: 用户自定义属性列表
错误处理
错误类型
use AuthError;
match result
错误恢复策略
// 令牌过期自动刷新
if token_info.is_expired || token_info.needs_refresh
// 网络错误重试
let result = retry_async_operation.await;
高级功能
并发处理
use Arc;
use JoinSet;
let auth = new;
let mut join_set = new;
// 并发获取多个令牌
for i in 0..5
// 等待所有请求完成
while let Some = join_set.join_next.await
自定义配置
// 自定义 HTTP 客户端
use Client;
let client = builder
.timeout
.user_agent
.build?;
let config = new
.with_base_url
.with_client;
最佳实践
1. 配置管理
// 使用环境变量
use env;
let app_id = var
.expect;
let app_secret = var
.expect;
let config = new;
2. 令牌缓存
// 使用内存缓存存储令牌
use HashMap;
use RwLock;
3. 自动刷新机制
async
功能标志
[]
= { = "0.1.0-dev", = [
"token-management", # 令牌管理功能
"cache", # 缓存功能
"oauth", # OAuth 功能
"encryption", # 加密功能
] }
token-management: 基础令牌管理功能cache: 内存缓存支持oauth: OAuth 授权功能encryption: 令牌加密存储
测试
运行测试
# 运行所有测试
# 运行集成测试
# 运行 Mock 测试
# 运行特定测试
测试覆盖率
# 安装 cargo-llvm-cov
# 生成覆盖率报告
# 生成 HTML 报告
构建状态
- ✅ 编译状态: 零警告编译
- ✅ 测试状态: 23/23 测试通过
- ✅ 文档状态: 100% 中文文档覆盖
- ✅ API 稳定性: 稳定的公共 API
版本历史
- v0.1.0-dev (当前版本)
- ✅ 完成 PVR 架构重构
- ✅ 实现 9 个认证 API
- ✅ 完整测试覆盖
- ✅ 企业级代码质量
贡献指南
开发环境设置
# 克隆项目
# 进入模块目录
# 安装开发依赖
# 运行测试
# 检查代码格式
# 运行 linter
添加新 API
- 在相应的
src/{project}/{version}/目录下创建新的资源文件 - 实现构建器模式 API
- 添加相应的数据模型到
src/models/ - 在
lib.rs中导出新服务 - 编写单元测试和集成测试
- 更新文档
许可证
本项目采用 Apache License 2.0 许可证。