讲师中心 微信公众号
AI工具推荐 视频效率加速

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

阿雪同学_5963

阿雪同学_5963

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

|

754人浏览过

|

来源于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):

{
  "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工具

更多
花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

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

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

320

2023.12.20

登录token无效
登录token无效

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

15066

2023.09.14

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

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

1765

2023.09.14

token怎么获取
token怎么获取

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

4197

2023.12.21

token什么意思
token什么意思

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

6361

2024.03.01

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

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

17200

2023.12.04

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

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

1223

2024.02.23

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

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

9310

2025.06.11

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn