You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Web API认证创建模型驱动Power App?解决401权限错误

解决Power Apps模型驱动应用API请求401未授权问题的步骤

401错误的核心是请求缺少合法的身份验证凭证,按以下步骤修复即可成功发起请求:

  • 步骤1:获取Azure AD访问令牌
    必须通过Azure AD获取针对Dynamics 365/Power Apps环境的访问令牌,常用两种方式:

    • 客户端凭据流(适合服务端自动化场景):在Azure AD注册应用,给应用分配Dynamics CRM的user_impersonation应用权限并完成管理员同意,然后请求https://login.microsoftonline.com/<租户ID>/oauth2/v2.0/token获取令牌,请求参数需包含client_id、client_secret、grant_type=client_credentials、scope=https://<OrganizationURI>.crm.dynamics.com/.default。
    • 授权码流(适合用户交互场景):引导用户登录授权,用授权码兑换访问令牌。
  • 步骤2:在请求头中添加Authorization字段
    将获取到的令牌加入请求头,格式为Authorization: Bearer <你的访问令牌>,修改后的请求头示例:

    header = {
      "Content-Type": "application/json",
      "OData-MaxVersion": "4.0",
      "OData-Version": "4.0",
      "Accept": "application/json",
      "Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6..."
    }
    
  • 步骤3:验证环境信息与权限

    • 把代码中的<OrganizationURI>替换为实际的Power Apps环境域名(比如从管理员中心或应用URL中提取的contosocrm)。
    • 确认用于获取令牌的账号/应用,在目标Power Apps环境中拥有创建模型驱动应用的权限(如系统管理员、系统定制员角色)。
    • 检查Azure AD应用的权限是否已正确配置并完成管理员同意(客户端凭据流必需)。
  • 步骤4:修正请求参数
    将示例中的webresourceid替换为当前环境中真实存在的应用图标Web资源ID,避免使用占位ID导致额外错误。

完整修正后的代码示例

import requests

# 替换为实际的租户ID、Azure AD应用信息、环境域名
tenant_id = "<你的租户ID>"
client_id = "<Azure AD应用客户端ID>"
client_secret = "<Azure AD应用客户端密钥>"
org_uri = "<OrganizationURI>"

# 获取访问令牌
token_url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token"
token_params = {
    "grant_type": "client_credentials",
    "client_id": client_id,
    "client_secret": client_secret,
    "scope": f"https://{org_uri}.crm.dynamics.com/.default"
}
token_response = requests.post(token_url, data=token_params)
access_token = token_response.json().get("access_token")

# 发起创建应用请求
url = f"https://{org_uri}.api.crm.dynamics.com/api/data/v9.0/appmodules"
header = {
    "Content-Type": "application/json",
    "OData-MaxVersion": "4.0",
    "OData-Version": "4.0",
    "Accept": "application/json",
    "Authorization": f"Bearer {access_token}"
}
data = {
    "name": "SDKTestApp",
    "uniquename": "SDKTestApp",
    "webresourceid": "<当前环境有效的Web资源ID>"
}
response = requests.post(url, headers=header, json=data)
print(response.status_code)
print(response.json())

内容的提问来源于stack exchange,提问作者Dinosaur Reporter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 16:40:19