使用 azure 函数处理来自 azure 逻辑应用程序的会议请求

Processing meeting requests from azure logic app with azure functions

经过数小时的研究,我完全感到困惑。围绕 azure 函数和 azure 逻辑应用程序以及围绕 azure ad 的图形和身份验证内容正在发生如此多的变化,因此真的很难找到合适的资源。

我想实现的很简单:

  1. 收到共享收件箱的新 E-Mail 时触发的 azure logic 应用程序。
  2. 如果这些 e-mails 是会议请求并且它们被标记为私人或以状态 'free' 发送,则会议请求应该被自动拒绝。
  3. 消息已发布到 Slack 频道。

预计第 2 步一切正常。不幸的是,没有默认连接器提供任何操作来阅读有关会议请求的更多详细信息,也没有连接器操作可以拒绝会议请求。所以显而易见的方法是使用 azure 函数并使用 Microsoft Graph API.

所以我总是失败的地方是: 如何在 Azure 函数中获取正确的 Auth 令牌以访问 Microsoft Graph?

由于逻辑应用程序是非交互式执行的,因此我无法进行任何交互式登录,并且我不想在代码中对任何凭据进行硬编码。

1.Open 函数应用中的 MSI

在您的函数应用程序中,导航至 Platform features、select Identity 并将 Status 切换为 On。单击 Save

2.Permissions 和托管服务身份的角色

授予服务主体权限以从我的 Azure AD 获取一些目录数据,例如用户信息。以下 Azure AD 命令将我的服务主体添加到 AD 目录角色 Directory Readers

3.Get 代币

因为您在 Azure 功能中打开了 MSI,您可以转到 https://***.scm.azurewebsites.net 并单击环境并获取 MSI_SECRET

public static async Task<HttpResponseMessage> GetToken(string resource, string apiversion)  {
    HttpClient client = new HttpClient();
    client.DefaultRequestHeaders.Add("Secret", Environment.GetEnvironmentVariable("MSI_SECRET"));
    return await client.GetAsync(String.Format("{0}/?resource={1}&api-version={2}", Environment.GetEnvironmentVariable("MSI_ENDPOINT"), resource, apiversion));
}

更多细节,你可以参考这个article and this one