{{ scope.row.is_active ? '正常' : '已禁用' }}
进入
```
### 4.2 后端 Python 示例
```python
import requests
from typing import List, Dict, Optional
class UAPAccountManager:
"""统一认证平台账号管理客户端"""
def __init__(self, base_url: str, access_token: str):
self.base_url = base_url.rstrip('/')
self.access_token = access_token
self.headers = {
'Authorization': f'Bearer {access_token}',
'Content-Type': 'application/json'
}
def get_my_mappings(
self,
skip: int = 0,
limit: int = 10,
app_name: Optional[str] = None
) -> Dict:
"""
获取我的账号映射列表
Args:
skip: 跳过的记录数
limit: 每页返回的记录数
app_name: 应用名称(模糊搜索)
Returns:
{
'total': 总记录数,
'items': [映射列表]
}
"""
params = {'skip': skip, 'limit': limit}
if app_name:
params['app_name'] = app_name
response = requests.get(
f'{self.base_url}/simple/me/mappings',
headers=self.headers,
params=params
)
response.raise_for_status()
return response.json()
def sso_login(
self,
app_id: str,
username: Optional[str] = None,
password: Optional[str] = None
) -> str:
"""
SSO 单点登录
Args:
app_id: 目标应用ID
username: 用户名(可选,如果已登录UAP可不提供)
password: 密码(可选,如果已登录UAP可不提供)
Returns:
跳转URL
"""
data = {'app_id': app_id}
if username and password:
data['username'] = username
data['password'] = password
# 如果提供了用户名密码,不使用 Bearer Token
headers = self.headers if not username else {'Content-Type': 'application/json'}
response = requests.post(
f'{self.base_url}/simple/sso-login',
headers=headers,
json=data
)
response.raise_for_status()
result = response.json()
return result['redirect_url']
# 使用示例
if __name__ == '__main__':
# 初始化客户端
manager = UAPAccountManager(
base_url='{{API_BASE_URL}}',
access_token='your_access_token_here'
)
# 获取账号映射列表
result = manager.get_my_mappings(skip=0, limit=10, app_name='OA')
print(f"总记录数: {result['total']}")
for mapping in result['items']:
print(f"应用: {mapping['app_name']}, 映射账号: {mapping['mapped_key']}")
# SSO 登录(会话认证)
redirect_url = manager.sso_login(app_id='oa_system_001')
print(f"跳转URL: {redirect_url}")
# SSO 登录(凭据认证)
redirect_url = manager.sso_login(
app_id='oa_system_001',
username='13800138000',
password='user_password_123'
)
print(f"跳转URL: {redirect_url}")
```
---
## 5. 注意事项
### 5.1 协议类型限制
- `GET /simple/me/mappings` 接口返回所有类型的应用映射
- `POST /simple/sso-login` 接口**仅支持 `SIMPLE_API` 协议类型**的应用
- 对于 `OIDC` 协议类型的应用,请使用标准的 OIDC 流程进行登录
### 5.2 账号状态
- 只有 `is_active: true` 的账号映射才能进行 SSO 登录
- 如果账号被禁用,SSO 登录会返回错误
### 5.3 安全建议
1. **Token 安全**: Bearer Token 应妥善保管,避免泄露
2. **HTTPS**: 生产环境必须使用 HTTPS 协议
3. **Token 过期**: 注意处理 Token 过期的情况,及时刷新或重新登录
4. **错误处理**: 建议实现完善的错误处理和重试机制
### 5.4 分页建议
- 默认每页返回 10 条记录
- 建议根据实际需求设置合适的 `limit` 值(最大建议 100)
- 使用 `skip` 和 `limit` 实现分页导航
---
## 6. 常见问题 (FAQ)
### Q1: 为什么 SSO 登录返回 400 错误,提示"协议不支持"?
**A:** `POST /simple/sso-login` 接口仅支持 `SIMPLE_API` 协议类型的应用。如果您的应用是 `OIDC` 类型,请使用标准的 OIDC 认证流程。
### Q2: 如何判断用户是否已登录 UAP 平台?
**A:** 如果您的应用中有有效的 `access_token`,可以在请求头中携带 `Authorization: Bearer {token}`。如果 Token 有效,则无需提供 `username` 和 `password`。
### Q3: 账号映射列表中的 `mapped_email` 为什么可能为空?
**A:** 不是所有第三方应用都要求或提供邮箱信息,因此 `mapped_email` 字段可能为 `null`。这是正常情况。
### Q4: 如何实现"记住我"功能?
**A:** 建议在客户端(浏览器)安全地存储 `access_token`(如使用 httpOnly Cookie 或安全的 localStorage),并在每次请求时携带该 Token。
### Q5: SSO 登录后,Ticket 的有效期是多久?
**A:** Ticket 的有效期由平台配置决定,通常为 5-10 分钟。建议在获取 `redirect_url` 后立即跳转,避免 Ticket 过期。
---
## 7. 更新日志
| 版本 | 日期 | 更新内容 |
|------|------|---------|
| V1.0 | 2026-01-XX | 初始版本发布 |
---
## 8. 技术支持
如有问题或建议,请联系技术支持团队或查看项目文档。
**文档地址**: `{{DOCS_BASE_URL}}/docs/account_management_api.md`