这个目录包含了一个使用DID(去中心化身份标识)进行身份验证的示例代码,展示了如何实现基于DID的认证中间件和客户端。
server.py: FastAPI服务器,使用DID认证中间件did_auth_middleware.py: DID认证中间件,处理DID认证和JWT令牌生成client.py: 客户端模块,使用DID进行身份验证并获取访问令牌did_auth_client.py: DID认证客户端类,提供结构化的DID认证和令牌管理功能jwt_config.py: JWT配置模块,提供读取公钥和私钥的函数test_token.py: 测试脚本,用于测试完整的认证流程private_key.pem和public_key.pem: JWT签名使用的密钥对
本项目使用Poetry进行依赖管理和虚拟环境管理。
# 安装所有依赖
poetry install
# 激活虚拟环境
poetry shell在激活虚拟环境后,直接使用Python启动服务器:
# 进入examples_code目录
cd examples_code
# 直接使用Python启动服务器
python server.py或者使用uvicorn启动:
# 使用uvicorn启动服务器
uvicorn examples_code.server:app --host 0.0.0.0 --port 8000 --reload在激活虚拟环境后,直接使用Python启动客户端:
# 进入examples_code目录
cd examples_code
# 直接使用Python启动客户端
python client.py或者使用模块方式运行:
# 使用Python模块方式运行客户端
python -m examples_code.clientclient.py 使用 DIDAuthClient 类实现了以下流程:
-
创建DID认证客户端:
- 使用DID文档路径和私钥路径初始化DIDAuthClient
- DIDAuthClient负责加载DID文档和私钥,并管理认证头和令牌
-
生成认证头和发送请求:
- 使用DIDAuthClient获取认证头(DID认证头或Bearer令牌)
- 向服务器发送带有认证头的请求
- 服务器验证认证头并生成JWT令牌
- 服务器在响应头中返回JWT令牌
-
管理令牌:
- DIDAuthClient从响应头中提取JWT令牌并存储
- 后续请求自动使用存储的令牌
- 如果令牌无效,DIDAuthClient会自动清除令牌并使用DID认证头重试
did_auth_client.py 提供了 DIDAuthClient 类,它具有以下功能:
-
认证头管理:
- 生成DID认证头
- 存储和管理JWT令牌
- 根据需要自动选择使用DID认证头或JWT令牌
-
多域名支持:
- 为不同域名分别存储认证头和令牌
- 根据请求URL自动选择正确的认证头
-
令牌生命周期管理:
- 从响应头中提取和更新令牌
- 清除单个域名的令牌或所有令牌
private_key.pem: JWT签名使用的私钥,位于examples_code目录下public_key.pem: JWT验证使用的公钥,位于examples_code目录下
这对密钥用于服务器生成JWT令牌和验证JWT令牌。
示例使用了位于项目根目录下use_did_test_public文件夹中的DID文档和私钥:
use_did_test_public/did.json: DID文档,已经注册到DID系统中use_did_test_public/key-1_private.pem: 与DID文档中公钥对应的私钥
这个DID文档已经注册,可以直接用于测试。DID文档中包含了公钥信息,私钥用于生成签名。
- 客户端使用DID文档和私钥生成认证头
- 客户端发送带有认证头的请求到服务器
- 服务器验证认证头,并生成JWT令牌
- 服务器在响应头中返回JWT令牌
- 客户端提取JWT令牌,并在后续请求中使用它
- 服务器验证JWT令牌,并处理请求
EXEMPT_PATHS: 在did_auth_middleware.py中定义,这些路径不需要认证WBA_SERVER_DOMAINS: 在did_auth_middleware.py中定义,允许的服务器域名列表
SERVER_URL: 在client.py中定义,服务器URLTEST_ENDPOINT: 在client.py中定义,测试端点DID_DOCUMENT_PATH: 在client.py中定义,DID文档路径PRIVATE_KEY_PATH: 在client.py中定义,私钥路径
如果遇到问题,可以尝试以下方法:
- 检查日志输出,了解认证流程中的问题
- 确保
/test路径不在EXEMPT_PATHS中,以便测试完整的认证流程 - 检查CORS配置,确保
Authorization头被正确暴露 - 使用
test_token.py脚本进行详细的调试
- FastAPI: Web框架
- PyJWT: JWT处理
- cryptography: 密码学操作
- aiohttp: 异步HTTP客户端
- agent-connect: DID认证库
