跳到主要内容

API授权

API授权用于管理第三方应用对本应用API接口的访问权限,通过accessKey/accessSecret密钥对控制哪些外部应用可以调用哪些API。它基于签名验证机制确保调用安全,自动记录所有API访问日志,为应用提供标准化的API开放能力。

API授权元素分层结构为Meta(apiAuths.Meta) → Type(apiAuths.NormalType) → 实例,开发者可通过JitAi的可视化开发工具快捷地创建API授权实例元素。

当然,开发者也可以创建自己的Type元素,或者在自己的App中改写JitAi官方提供的apiAuths.NormalType元素,以实现自己的封装。

快速开始

创建实例元素

目录结构

推荐目录结构
apiAuths/
└── myApiAuth/
├── e.json
└── myApiAuth.json

路径可自定义,示例仅为推荐做法。

e.json文件

元素声明文件
{
"title": "我的API授权",
"type": "apiAuths.NormalType",
"accessKey": "your_access_key",
"backendBundleEntry": "."
}

业务配置文件

业务配置文件(myApiAuth.json)
{
"accessKey": "your_access_key",
"accessSecret": "generated_secret",
"remark": "API授权说明",
"apis": [
"services.UserSvc.getUserInfo",
"services.OrderSvc.getOrderList"
]
}

调用示例

获取API授权元素
# 获取API授权实例
apiAuth = app.getElement("apiAuths.myApiAuth")

# 获取授权详情
details = apiAuth.getDetails()
print(f"授权API列表: {details}")

# 通过服务获取授权信息
authSvc = app.getElement("apiAuths.services.ApiAuthSvc")
authDetails = authSvc.getDetails("your_access_key")

元素配置

e.json配置

参数名类型必填说明
titlestring授权名称
typestring固定值:apiAuths.NormalType
accessKeystring访问密钥标识
backendBundleEntrystring后端入口,通常为"."

业务配置文件配置

参数名类型必填说明
accessKeystring访问密钥,用于身份识别
accessSecretstring访问密文,用于签名验证
remarkstring授权备注说明
apisarray允许访问的API列表,格式:服务全名.方法名

方法

getDetails

获取API授权的详细信息,包含所有授权的服务和方法列表。

返回值

返回包含授权详情的列表,每个服务包含title、fullName和functionList信息。

使用示例

获取授权详情
apiAuth = app.getElement("apiAuths.myApiAuth")
details = apiAuth.getDetails()

# 输出示例
for service in details:
print(f"服务: {service['title']} ({service['fullName']})")
for func in service['functionList']:
print(f" - {func['title']}: {func['name']}")

before

请求前置拦截处理,执行权限校验和签名验证。

使用示例

拦截器使用
# 在API请求处理前自动调用
# 1. 检查API是否在授权列表中
# 2. 验证请求头中的timestamp和accessSign
# 3. 进行签名校验

after

请求后置处理,对响应数据进行签名并记录调用日志。

使用示例

响应处理
# 在API请求处理后自动调用
# 1. 对响应数据进行签名
# 2. 添加timestamp和accessSign到响应
# 3. 保存调用记录到数据库

saveLog

保存API调用记录到数据库,记录请求详情、耗时、错误信息等。

参数详解

参数名类型对应原生类型必填说明
respDataJitDictdict响应数据

使用示例

手动保存日志
apiAuth = app.getElement("apiAuths.myApiAuth")
respData = {"status": "success", "data": "result"}
apiAuth.saveLog(respData)

属性

accessKey

访问密钥标识,用于身份识别和权限查找。

accessSecret

访问密文,用于请求签名的生成和验证。

apis

授权的API列表,包含允许访问的服务方法全名。

currApi

当前请求的API路径,基于请求URL解析得出。

request

当前HTTP请求对象,包含请求的所有信息。

高级特性

签名验证机制

API授权使用时间戳+数据签名的双重验证机制:

签名验证流程
# 客户端生成签名
timestamp = int(time.time() * 1000)
data = {"param1": "value1", "param2": "value2"}
sign_data = {"timestamp": timestamp, "accessSign": generated_sign, **data}

# 服务端验证签名
# 1. 检查时间戳是否超时
# 2. 使用相同算法重新计算签名
# 3. 比较签名是否一致

调用记录追踪

系统自动记录所有API调用的详细信息:

调用记录字段
{
"accessKey": "访问密钥",
"requestId": "请求ID",
"timestamp": "请求时间戳",
"ip": "客户端IP",
"domain": "请求域名",
"path": "请求路径",
"element": "服务元素名",
"funcName": "方法名",
"duration": "耗时(毫秒)",
"errcode": "错误码",
"errmsg": "错误信息"
}

权限动态管理

支持运行时动态更新授权配置:

动态权限管理
# 通过ApiAuthSvc服务管理权限
authSvc = app.getElement("apiAuths.services.ApiAuthSvc")

# 生成新的访问密文
result = authSvc.genAccessSecret("new_access_key")
new_secret = result["accessSecret"]

# 验证访问密文
authSvc.checkAccessSecret("access_key", "access_secret")

# 获取远程授权详情
remote_details = authSvc.getAuthDetails(
"https://domain.com/org/app",
"access_key",
"access_secret"
)