
使用 Azure Graph API 为应用添加密码(密钥)时,若通过 json= 参数传递已序列化的 JSON 字符串(如 json.dumps(payload)),API 将忽略自定义的 startDateTime 和 endDateTime,退回到默认策略(2年有效期)。根本原因是重复序列化导致请求体格式错误。
使用 azure graph api 为应用添加密码(密钥)时,若通过 `json=` 参数传递已序列化的 json 字符串(如 `json.dumps(payload)`),api 将忽略自定义的 `startdatetime` 和 `enddatetime`,退回到默认策略(2年有效期)。根本原因是重复序列化导致请求体格式错误。
在调用 Microsoft Graph REST API 的 applications/{id}/addPassword 端点时,startDateTime 和 endDateTime 字段虽支持 ISO 8601 格式(如 2024-05-20T08:30:00.000Z),但其生效前提是请求体结构严格符合 API 预期——即:requests.post(..., json=...) 必须接收一个原生 Python 字典对象,而非手动 JSON 序列化后的字符串。
一旦误用 json.dumps() 将 payload 转为字符串再传入 json= 参数,requests 库会再次对其编码,导致最终发送的请求体为双重嵌套或格式异常的 JSON(例如 "{\"passwordCredential\":{...}}")。Graph API 无法解析该结构中的 passwordCredential 对象,于是静默忽略所有自定义时间字段,直接启用默认策略:startDateTime = now()、endDateTime = now() + 2 years。此过程无 HTTP 错误码(返回 200),仅行为不符合预期,极易造成排查困难。
✅ 正确做法如下(关键修正仅两处):
# ✅ 正确:payload 是 dict,由 requests 自动序列化
start_date = datetime.now(timezone.utc)
end_date = start_date + timedelta(days=60)
start_date_str = start_date.strftime('%Y-%m-%dT%H:%M:%S.%fZ')[:-3] + 'Z' # 建议截断微秒至毫秒(.000Z)
end_date_str = end_date.strftime('%Y-%m-%dT%H:%M:%S.%fZ')[:-3] + 'Z'
payload = {
"passwordCredential": {
"displayName": "KeyRenewal",
"startDateTime": start_date_str,
"endDateTime": end_date_str
}
}
response = requests.post(
url=url,
headers={
'Authorization': f'Bearer {access_token}',
'Content-Type': 'application/json'
},
json=payload # ← 直接传 dict,不要 json.dumps(payload)
)
⚠️ 注意事项:
-
时间精度建议:Graph API 对微秒(
.%f)支持不稳定,推荐统一截断为毫秒格式(如2024-05-20T08:30:00.000Z),可通过[:-3] + 'Z'实现; -
时区强制 UTC:务必使用
datetime.now(timezone.utc),不可依赖本地时区或datetime.utcnow()(后者不带 tzinfo); -
字段名大小写敏感:必须为
startDateTime/endDateTime(驼峰命名),拼写错误将被忽略; -
权限验证:确保访问令牌具备
Application.ReadWrite.All或Directory.ReadWrite.All应用权限(委托权限不适用); -
调试技巧:启用
requests日志(logging.basicConfig(level=logging.DEBUG))可查看实际发出的请求体,快速识别是否发生双重序列化。
总结:Graph API 的健壮性设计使其对无效字段“静默降级”,这既是便利也是陷阱。开发者需严格遵循客户端库约定——json= 参数只接受原始数据结构,交由库完成序列化与 Content-Type 设置。这一原则同样适用于所有主流 HTTP 客户端(如 axios 的 data、fetch 的 JSON.stringify() 手动处理等场景),是 REST API 集成中的通用最佳实践。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










