为 Power Automate 创建Microsoft Graph JSON Batch 自定义连接器
Microsoft Power Automate 有 230 多个现用连接器。 其中许多连接器使用 Microsoft Graph 与Microsoft产品的特定终结点进行通信。 此外,在其他情况下,我们可能需要使用服务的基本构建基块直接从 Power Automate 调用 Microsoft Graph,因为没有连接器直接与 Microsoft Graph 通信以涵盖整个 API。
除了解决直接调用 Microsoft Graph 的方案外,许多Microsoft Graph API 终结点仅支持 委派权限。 Microsoft Power Automate 中的 HTTP 连接器可实现非常灵活的集成,包括调用 Microsoft Graph。 但是,HTTP 连接器缺乏缓存用户凭据以启用特定委派权限方案的功能。 在这些情况下,可以创建自定义连接器,以围绕 Microsoft 图形 API 提供包装器,并允许使用具有委派权限的 API。
本实验室涵盖上述两种方案。 首先,你将创建自定义连接器,以启用与需要 委派权限的 Microsoft Graph 的集成。 其次,你将使用 $batch 请求终结点来提供对 Microsoft Graph 的全部功能的访问权限,同时使用委托的权限,这些权限要求应用存在“已登录”用户。
注意
本教程介绍如何创建自定义连接器以用于 Microsoft Power Automate 和 Azure 逻辑应用。 本教程假定你已阅读 自定义连接器概述 以了解该过程。
先决条件
若要完成本文中的本练习,需要以下各项:
- 对 Microsoft 365 租户的管理员访问权限。 如果没有 Microsoft 365 租户,则可以通过 Microsoft 365 开发人员计划获得租户;有关详细信息,请参阅 常见问题解答。 或者,可以 注册 1 个月的免费试用版或购买 Microsoft 365 计划。
- 使用高级许可证访问 Microsoft Power Automate 。 有关详细信息 ,请参阅 Power Automate 许可常见问题解答 。 如果没有高级许可证,可以注册 90 天试用版。
反馈
请在 GitHub 存储库中提供有关本教程的任何反馈。
创建 Azure AD 应用注册
在本练习中,你将创建新的 Azure Active Directory 应用程序,该应用程序将用于为自定义连接器提供委托的权限。
打开浏览器,导航到 Microsoft Entra 管理中心 ,并使用全局管理员帐户登录。
在左侧导航栏中选择“Microsoft Entra ID”,依次展开“标识”、“应用程序”和“应用注册”。
选择“应用注册”边栏选项卡顶部的“新建注册”菜单项。
在“名称”字段中输入 MS Graph Batch App
。 在 “支持的帐户类型 ”部分中,选择“ 任何组织目录中的帐户”。 将 “重定向 URI ”部分留空,然后选择“ 注册”。
在“ MS Graph Batch 应用” 边栏选项卡上,复制 “应用程序 (客户端) ID”。 在下一个练习中,你将需要用到它。
在“MS Graph Batch 应用”边栏选项卡的“管理”部分选择“API 权限”条目。 选择“API权限”下的“添加权限”。
在 “请求 API 权限” 边栏选项卡中,选择 “Microsoft图形”,然后选择“ 委托的权限”。
group
搜索 ,然后选择“读取和写入所有组委托的权限”。 选择边栏选项卡底部的 “添加权限 ”。
在 MS Graph Batch App 边栏选项卡的“管理”部分选择“证书和机密”条目,然后选择“新建客户端密码”。 输入说明,选择持续时间,然后选择 “添加”。
复制新机密的值。 在下一个练习中,你将需要用到它。
重要
此步骤至关重要,因为关闭此边栏选项卡后,无法访问机密。 将此机密保存到文本编辑器,以便在后续练习中使用。
若要启用通过 Microsoft Graph 访问的其他服务(包括 Teams 属性)的管理,需要选择其他适当的范围来启用管理特定服务。 例如,若要扩展我们的解决方案以允许创建 OneNote Notebooks 或 Planner 计划、存储桶和任务,需要为相关 API 添加所需的权限范围。
创建自定义连接器
在本练习中,你将创建一个新的自定义连接器,该连接器可在 Microsoft Power Automate 或 Azure 逻辑应用中使用。 OpenAPI 定义文件是预生成的,其中包含Microsoft Graph $batch
终结点的正确路径,以及用于启用简单导入的其他设置。
打开浏览器并导航到 Microsoft Power Automate。 使用 Microsoft 365 租户管理员帐户登录。 在左侧菜单中选择 “自定义连接器 ”。 如果菜单中不存在 自定义连接器 ,请选择“ 更多”,然后选择“ 全部发现”。
有两个选项可用于为 Microsoft Graph 创建自定义连接器:
- 从空白创建
- 导入 OpenAPI 文件
在 “自定义连接器 ”页上,选择右上角的“ 新建自定义连接器 ”链接,然后在下拉菜单中选择“ 从空白创建 ”项。
在“连接器名称”文本框中输入 MS Graph Batch Connector
。 Choose Continue.
在连接器配置 “常规 ”页上,填写字段,如下所示。
- 方案:HTTPS
-
主机:
graph.microsoft.com
-
基 URL:
/
选择“ 安全 ”按钮以继续。
在“ 安全性 ”页上,按如下所示填写字段。
-
选择 API 实现的身份验证:
OAuth 2.0
-
标识提供者:
Azure Active Directory
- 客户端 ID:在上一练习中创建的应用程序 ID
- 客户端密码:在上一练习中创建的密钥
-
登录 URL:
https://login.windows.net
-
租户 ID:
common
-
资源 URL:
https://graph.microsoft.com
(无尾随 /) - 范围:留空
选择 “定义 ”按钮以继续。
在 “定义 ”页上,选择“ 新建操作” 并填写字段,如下所示。
-
摘要:
Batch
-
说明:
Execute Batch with Delegate Permission
-
操作 ID:
Batch
-
可见性:
important
通过选择“从示例导入”创建请求,并填写字段,如下所示。
-
谓词:
POST
-
URL:
https://graph.microsoft.com/v1.0/$batch
- 标头:保留为空
-
正文:
{}
选择“导入”。
选择右上角的 “创建连接器 ”。
创建连接器后,从“安全性”选项卡复制生成的重定向 URL。
返回到在上一练习中创建的 Microsoft Entra 门户中注册的应用程序。 在左侧菜单中选择“ 身份验证 ”。 选择 添加平台",然后选择 Web。 在“重定向 URI”中输入从上一步骤复制的 重定向 URL,然后选择“ 配置”。
为连接器授权
确保连接器可供使用的最后一个配置步骤是授权并测试自定义连接器以创建缓存连接。
重要
以下步骤要求使用管理员权限登录。
在 Microsoft Power Automate 中,选择左侧菜单中的“ 连接 ”。 如果菜单中不存在 “连接” ,请选择“ 更多”。 选择“ 新建连接” 链接。
通过选择自定义连接器,然后选择“ 创建”,找到并完成连接。 使用 Microsoft 365 租户管理员的 Azure Active Directory 帐户登录。
当系统提示输入请求的权限时,选中“ 代表组织同意” ,然后选择“ 接受” 以授权权限。
授权权限后,在 Power Automate 中创建连接。
自定义连接器现已配置并启用。 应用的权限和可用权限可能存在延迟,但连接器现已配置。
测试 Graph 浏览器中的批处理功能
在创建流以使用新连接器之前,请使用 Microsoft Graph 资源管理器 在 Microsoft Graph 中发现 JSON 批处理的一些功能和功能。
在浏览器中打开 Microsoft Graph 资源管理器 。 使用 Microsoft 365 租户管理员帐户登录。 从示例查询中搜索 Batch。
在左侧菜单中选择 “执行并行 GET ”示例查询。 选择屏幕右上角的 “运行查询 ”按钮。
示例批处理操作对三个 HTTP GET 请求进行批处理,并向 Graph 终结点发出单个 HTTP POST /v1.0/$batch
。
{
"requests": [
{
"url": "/me?$select=displayName,jobTitle,userPrincipalName",
"method": "GET",
"id": "1"
},
{
"url": "/me/messages?$filter=importance eq 'high'&$select=from,subject,receivedDateTime,bodyPreview",
"method": "GET",
"id": "2"
},
{
"url": "/me/events",
"method": "GET",
"id": "3"
}
]
}
返回的响应如下所示。 请注意Microsoft Graph 返回的响应数组。 对批处理请求的响应可能以与 POST 中的请求顺序不同的顺序显示。 属性 id
应用于将单个批处理请求与特定批处理响应相关联。
注意
为了提高可读性,响应已被截断。
{
"responses": [
{
"id": "1",
"status": 200,
"headers": {...},
"body": {...}
},
{
"id": "3",
"status": 200,
"headers": {...},
"body": {...}
}
{
"id": "2",
"status": 200,
"headers": {...},
"body": {...}
}
]
}
每个响应都包含 、id
status
、 headers
和 body
属性。
status
如果请求的 属性指示失败,则 body
包含从请求返回的任何错误信息。
为了确保请求的操作顺序,可以使用 dependsOn 属性对单个请求进行排序。
除了排序和依赖项操作外,JSON 批处理还假定基路径,并执行来自相对路径的请求。 每个批处理请求元素都从 /v1.0/$batch
指定的 OR /beta/$batch
终结点执行。 这可能会有显著差异, /beta
因为终结点可能会返回终结点中 /v1.0
可能不会返回的其他输出。
例如,在 Microsoft Graph 资源管理器中执行以下两个查询。
-
/v1.0/$batch
使用 url/me
查询终结点, (复制和粘贴请求) 。
{
"requests": [
{
"id": 1,
"url": "/me",
"method": "GET"
}
]
}
现在,使用版本选择器下拉列表更改为 beta
终结点,并发出完全相同的请求。
返回的结果有何差异? 尝试其他一些查询来识别一些差异。
除了 来自 /v1.0
和 /beta
终结点的不同响应内容外,还必须了解在发出未授予权限同意的批处理请求时可能出现的错误。 例如,下面是用于创建 OneNote 笔记本的批处理请求项。
{
"id": 1,
"url": "/groups/65c5ecf9-3311-449c-9904-29a2c76b9a50/onenote/notebooks",
"headers": {
"Content-Type": "application/json"
},
"method": "POST",
"body": {
"displayName": "Meeting Notes"
}
}
但是,如果尚未授予创建 OneNote 笔记本的权限,则会收到以下响应。 请注意,指示提供的 OAuth 令牌的状态代码 403 (Forbidden)
和错误消息不包括完成请求的操作所需的范围。
{
"responses": [
{
"id": "1",
"status": 403,
"headers": {
"Cache-Control": "no-cache"
},
"body": {
"error": {
"code": "40004",
"message": "The OAuth token provided does not have the necessary scopes to complete the request.
Please make sure you are including one or more of the following scopes: Notes.ReadWrite.All,
Notes.Read.All (you provided these scopes: Group.Read.All,Group.ReadWrite.All,User.Read,User.Read.All)",
"innerError": {
"request-id": "92d50317-aa06-4bd7-b908-c85ee4eff0e9",
"date": "2018-10-17T02:01:10"
}
}
}
}
]
}
批处理中的每个请求都将返回状态代码以及结果或错误信息。 必须处理每个响应,以确定单个批处理操作是成功还是失败。
创建流
在本练习中,你将创建一个流,以使用在前面的练习中创建的自定义连接器来创建和配置Microsoft团队。 流将使用自定义连接器发送创建 Office 365 统一组的 POST 请求,在组创建完成时暂停延迟,然后发送 PUT 请求以将组与Microsoft团队相关联。
最后,流将类似于下图:
在浏览器中打开 Microsoft Power Automate ,并使用 Office 365 租户管理员帐户登录。 在左侧导航栏中选择 “我的流 ”。 选择 “新建流”,然后选择 “即时云流”。 输入 Create Team
作为“流名称”,然后在“选择触发此流的方式”下选择“手动触发流”。 选择"创建"。
选择“ 手动触发流 ”项,然后依次选择“ 添加输入”、“ 文本 ”和“输入 Name
”作为标题。
在“手动触发流”项下选择+,然后选择“添加操作”。
Batch
在搜索框中键入,并将“运行时”下拉列表设置为“自定义”。 添加 MS Graph Batch Connector 操作。 选择省略号并将此操作重命名为 Batch POST-groups
。
在 “高级参数 ”下拉列表中,选择 正文。 将以下代码添加到操作的“ 正文 ”文本框中。
{
"requests": [
{
"url": "/groups",
"method": "POST",
"id": 1,
"headers": { "Content-Type": "application/json" },
"body": {
"description": "REPLACE",
"displayName": "REPLACE",
"groupTypes": ["Unified"],
"mailEnabled": true,
"mailNickname": "REPLACE",
"securityEnabled": false
}
}
]
}
通过从“添加动态内容”菜单中选择手动触发器中的Name
值来替换每个REPLACE
占位符。
在“Batch POST 组”项下选择+,然后选择“添加操作”。
delay
搜索并添加延迟操作并配置 1 分钟。
在“延迟”项下选择+,然后选择“添加操作”。 添加 MS Graph Batch Connector 操作。 选择省略号并将此操作重命名为 Batch PUT-team
。
在 “高级参数 ”下拉列表中,选择 正文。 将以下代码添加到操作的“ 正文 ”文本框中。
{
"requests": [
{
"id": 1,
"url": "/groups/REPLACE/team",
"method": "PUT",
"headers": {
"Content-Type": "application/json"
},
"body": {
"memberSettings": {
"allowCreateUpdateChannels": true
},
"messagingSettings": {
"allowUserEditMessages": true,
"allowUserDeleteMessages": true
},
"funSettings": {
"allowGiphy": true,
"giphyContentRating": "strict"
}
}
}
]
}
选择占 REPLACE
位符,然后在动态内容窗格中选择“ 表达式 ”。 将以下公式添加到 表达式中。
body('Batch_POST-groups').responses[0].body.id
此公式指定我们要使用第一个操作的结果中的组 ID。
选择 “保存”,然后选择“ 测试 ”以执行流。
提示
如果收到类似 The template validation failed: 'The action(s) 'Batch_POST-groups' referenced by 'inputs' in action 'Batch_2' are not defined in the template'
的错误,则表达式不正确,并且可能引用它找不到的流操作。 确保引用的操作名称完全匹配。
选择“ 手动 操作”单选按钮,然后选择“ 测试”。 提供一个不带空格的名称,然后选择 “运行流 ”以创建团队。
最后,选择“ 完成” 以查看活动日志。 流完成后,已配置 Office 365 组和团队。 选择 Batch 操作项以查看 JSON Batch 调用的结果。 对于 outputs
成功的团队关联, Batch PUT-team
操作的状态代码应为 201,如下图所示。
扩展流
在上一练习中创建的流使用 $batch
API 向 Microsoft Graph 发出两个单独的请求。
$batch
以这种方式调用终结点可提供一些优势和灵活性,但当在单个$batch
调用中执行多个请求以Microsoft Graph 时,终结点的真正强大功能$batch
就会出现。 在本练习中,你将扩展创建统一组和关联团队的示例,以包括在单个 $batch
请求中为团队创建多个默认频道。
在浏览器中打开 Microsoft Power Automate ,并使用 Microsoft 365 租户管理员帐户登录。 选择在上一步中创建的流,然后选择 “编辑”。
选择 “新建步骤 ”,并在 Batch
搜索框中键入。 添加 MS Graph Batch Connector 操作。 选择省略号并将此操作重命名为 Batch POST-channels
。
将以下代码添加到操作的 正文 文本框中。
{
"requests": [
{
"id": 1,
"url": "/teams/REPLACE/channels",
"headers": {
"Content-Type": "application/json"
},
"method": "POST",
"body": {
"displayName": "Marketing Collateral",
"description": "Marketing collateral and documentation."
}
},
{
"id": 2,
"dependsOn": [
"1"
],
"url": "/teams/REPLACE/channels",
"headers": {
"Content-Type": "application/json"
},
"method": "POST",
"body": {
"displayName": "Vendor Contracts",
"description": "Vendor documents, contracts, agreements and schedules."
}
},
{
"id": 3,
"dependsOn": [
"2"
],
"url": "/teams/REPLACE/channels",
"headers": {
"Content-Type": "application/json"
},
"method": "POST",
"body": {
"displayName": "General Client Agreements",
"description": "General Client documents and agreements."
}
}
]
}
请注意,上述三个请求使用 dependsOn 属性指定序列顺序,每个请求都将执行 POST 请求以在新团队中创建新通道。
选择占位符的每个实例 REPLACE
,然后在动态内容窗格中选择“ 表达式 ”。 将以下公式添加到 表达式中。
body('Batch_PUT-team').responses[0].body.id
选择 “保存”,然后选择“ 测试 ”以执行流。 选择“ 我将执行触发器操作” 单选按钮,然后选择 “保存 & 测试”。 在“ 名称” 字段中输入唯一的组名称(不含空格),然后选择 “运行流 ”以执行 Flow。
流启动后,选择“ 完成 ”按钮以查看活动日志。 当流完成时,操作的最终输出 Batch POST-channels
会针对创建的每个通道提供 201 HTTP 状态响应。
浏览到 Microsoft Teams 并使用 Microsoft 365 租户管理员帐户登录。 验证你刚刚创建的团队是否显示,并包含请求 $batch
创建的三个频道。
Batch POST-channels
虽然上述操作在本教程中是作为单独的操作实现的,但创建通道的调用可能已添加为操作中的其他Batch PUT-team
调用。 这会在单个批处理调用中创建团队和所有频道。 自己试一试。
最后,请记住, JSON 批处理 调用将返回每个请求的 HTTP 状态代码。 在生产过程中,你可能希望将结果的后期处理与 Apply to each
操作相结合,并验证每个响应是否具有 201 状态代码或补偿收到的任何其他状态代码。
恭喜!
已完成 Power Automate Microsoft Graph 教程。 现在,你已有一个可调用 Microsoft Graph 的工作自定义连接器,可以试验和添加新功能。 访问 Microsoft Graph 概述 ,查看可以使用 Microsoft Graph 访问的所有数据。
反馈
请在 GitHub 存储库中提供有关本教程的任何反馈。
你有关于此部分的问题? 如果有,请向我们提供反馈,以便我们对此部分作出改进。