0

0

Azure AD 应用密钥创建失败?404 错误的根源与正确实践指南

聖光之護

聖光之護

发布时间:2026-03-04 08:53:01

|

734人浏览过

|

来源于php中文网

原创

Azure AD 应用密钥创建失败?404 错误的根源与正确实践指南

本文详解 Azure AD 中通过 Microsoft Graph API 为应用添加客户端密钥(client secret)时出现 404 错误的根本原因——混淆 appId 与 id,并提供可直接运行的修复代码、权限验证要点及生产级最佳实践。

本文详解 azure ad 中通过 microsoft graph api 为应用添加客户端密钥(client secret)时出现 404 错误的根本原因——混淆 `appid` 与 `id`,并提供可直接运行的修复代码、权限验证要点及生产级最佳实践。

在使用 Microsoft Graph API 的 /applications/{id}/addPassword 端点动态创建客户端密钥时,开发者常因对象标识符理解偏差而遭遇 404 Resource Not Found 错误。如问题所示,尽管目标应用在 Azure 门户中清晰可见,但请求返回:

{
  "error": {
    "code": "Request_ResourceNotFound",
    "message": "Resource '888-xxxx-xxxx-xxxxx' does not exist..."
  }
}

核心症结在于:{id} 必须是应用对象的 Graph 对象 ID(即 application.id),而非其公开的 appId(即客户端 ID)。

Azure AD 中每个应用注册对应两个关键唯一标识:

  • appId(又称 Client ID):用于 OAuth 流程中的 client_id 参数,是应用的“公开身份”,可在门户「应用注册」列表或 manifest 中的 "appId" 字段查到;
  • id(Object ID):Graph API 内部管理的应用资源唯一标识,仅在 Graph 响应(如 GET /applications)或应用 manifest 的顶层 "id" 字段中暴露。

✅ 正确示例(来自 manifest):

ChatGPT Writer
ChatGPT Writer

免费 Chrome 扩展程序,使用 ChatGPT AI 生成电子邮件和消息。

下载
{
  "id": "e9e28b75-9236-46c3-8422-f5aebc7d6df3",  // ← 此为 Graph API 所需的 {id}
  "appId": "77b9c7ae-b4d4-4d51-b479-9bae4a0186db"  // ← 此非 Graph 路径参数
}

因此,原代码中错误地将 application_id = '888-xxxx...'(实为 appId)拼入 URL:

url_password = f'{resource_url}/v1.0/applications/{application_id}/addPassword'
# ❌ 错误:application_id 是 appId,不是 Graph object ID

应替换为从 Graph 获取的真实 application.id。推荐两种稳健方案:

✅ 方案一:先查询应用获取真实 ID(推荐,适用于自动化流程)

# 1. 使用已获授权的 access_token 查询应用(按 appId 过滤)
search_endpoint = f"https://graph.microsoft.com/v1.0/applications?$filter=appId eq '{application_id}'"
search_resp = requests.get(search_endpoint, headers=headers)
search_data = search_resp.json()

if search_data.get('value') and len(search_data['value']) > 0:
    app_object_id = search_data['value'][0]['id']  # ✅ 提取真正的 Graph object ID
    print(f"Found application object ID: {app_object_id}")
else:
    raise ValueError(f"Application with appId '{application_id}' not found in tenant.")

# 2. 使用 app_object_id 构造 addPassword 请求
url_password = f"https://graph.microsoft.com/v1.0/applications/{app_object_id}/addPassword"

password_credentials_data = {
    "passwordCredential": {
        "displayName": f"AutoGen_Secret_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
    }
}

response = requests.post(url_password, headers=headers, json=password_credentials_data)

if response.status_code == 200:
    secret_result = response.json()
    print("✅ Secret created successfully!")
    print(f"Secret ID: {secret_result['secretText']}")
    print(f"Expires: {secret_result['endDateTime']}")
else:
    print(f"❌ Failed with status {response.status_code}: {response.text}")

✅ 方案二:硬编码 id(仅限开发/测试环境快速验证)

若已知 manifest 中的 id(如 "e9e28b75-...-f5aebc7d6df3"),可直接赋值:

app_object_id = "e9e28b75-9236-46c3-8422-f5aebc7d6df3"  # ✅ 来自 manifest 的顶层 id
url_password = f"https://graph.microsoft.com/v1.0/applications/{app_object_id}/addPassword"
# ... 后续同上

⚠️ 关键注意事项

  • 权限必须为 Application 权限:Application.ReadWrite.All(仅 Application 类型,Delegated 权限无效);
  • Consent 已完成:管理员需已在 Azure 门户中为该应用授予 Application.ReadWrite.All 的管理员同意;
  • Token Scope:scope 必须为 https://graph.microsoft.com/.default(不可省略 .default);
  • 租户上下文:确保 TENANT_ID 与应用所在租户一致(B2C 租户需使用 B2C 目录 ID,非 B2C 租户 ID);
  • 密钥生命周期管理:addPassword 返回的 secretText 仅响应一次可见,务必立即安全存储;过期时间由 endDateTime 字段指定(默认 2 年),建议显式设置 endDateTime。

? 总结

404 错误绝非网络或权限配置问题,而是典型的 ID 语义误用。牢记:Microsoft Graph 所有 /applications/{id} 路径中的 {id} 永远指代 Graph 对象 ID(manifest 中的 id 字段),而非 appId。将其与查询逻辑解耦、自动化获取,是构建可靠 CI/CD 密钥轮换流程的基础。生产环境中,强烈建议结合 Azure Key Vault 存储密钥,并启用密钥过期自动告警与刷新机制。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
resource是什么文件
resource是什么文件

Resource文件是一种特殊类型的文件,它通常用于存储应用程序或操作系统中的各种资源信息。它们在应用程序开发中起着关键作用,并在跨平台开发和国际化方面提供支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

174

2023.12.20

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6511

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

840

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1088

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1804

2024.03.01

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

313

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

290

2025.06.11

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

3

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号