如何通过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。 - 授权码流(适合用户交互场景):引导用户登录授权,用授权码兑换访问令牌。
- 客户端凭据流(适合服务端自动化场景):在Azure AD注册应用,给应用分配Dynamics CRM的
步骤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
相关产品推荐
相关产品推荐

