【问题标题】:Can't call Graph API calendars from a daemon application无法从守护程序应用程序调用 Graph API 日历
【发布时间】:2021-12-26 22:55:07
【问题描述】:

我是 Graph API 的新手,我想使用来自守护程序应用程序的事件时间表来调用我的 Outlook 日历。 当我使用用于登录 Azure 的电子邮件登录 Microsoft 帐户时,我可以正常查看日历,还可以使用 Graph Explorer 调用 Web API。 例如。图形资源管理器调用: https://graph.microsoft.com/v1.0/me/calendars 当我使用我的 Microsoft 帐户登录时,可以正常返回我的日历事件。

现在。我希望能够使用服务应用程序访问相同的 API,即无需用户登录提示。所以我去了 Azure 门户,创建并注册了一个新应用程序,在管理员同意的情况下为其授予 Calendar.Read API 权限,并下载了一个快速启动守护程序应用程序,该应用程序使

等待 apiCaller.CallWebApiAndProcessResultASync($"{config.ApiUrl}v1.0/users", result.AccessToken, 显示);

调用有效,即它返回一个用户,以便我可以看到“userPrincipalName”:“XYZ@.onmicrosoft.com”,这不是 Graph Explorer 调用返回的。图形浏览器调用: https://graph.microsoft.com/v1.0/users 返回“userPrincipalName”:“myactualemail” 所以基本上当我调用 Graph Explorer 时: 图.microsoft.com https://graph.microsoft.com/v1.0/me/calendars 它返回正确的日历结果。 但是,等效的守护程序 API 调用 等待 apiCaller.CallWebApiAndProcessResultASync($"{config.ApiUrl}v1.0/users/f5a1a942-f9e4-460b-9c6c-16f45045548f/calendars", result.AccessToken, Display); 返回:

Failed to call the web API: NotFound
Content: {"error":{"code":"ResourceNotFound","message":"Resource could not be discovered.","innerError":{"date":"2021-12-26T16:46:35","request-id":"67ef50e4-bec6-48ae-9e45-7765436d1345","client-request-id":"67ef50e4-bec6-48ae-9e45-7765436d1345"}}}

我怀疑问题在于 Graph Explorer 和守护程序应用程序之间的 userPrincipalName 不匹配,但我找不到解决方案。 另请注意,需要手动用户登录的普通 ASP.Core 示例可以正常工作。问题仅在于守护程序应用程序。

【问题讨论】:

    标签: azure-active-directory microsoft-graph-api azure-web-app-service outlook-api


    【解决方案1】:

    在你的情况下没有“我”,所以你需要使用https://graph.microsoft.com/v1.0/users/user@domain.demo/calendars url。

    【讨论】:

    • 没错。这是我的问题。我正在使用:await apiCaller.CallWebApiAndProcessResultASync($"{config.ApiUrl}v1.0/users/f5a1a942-f9e4-460b-9c6c-16f45045548f/calendars。但它不起作用
    【解决方案2】:

    当您使用Graph Explorer测试api时,您已经登录了网站,因此请求中包含的/me/calendars可以知道me是谁,然后将正确的数据返回给您。

    回到你的 daemon 应用,我们通常使用客户端凭证流来获取访问令牌/凭证来调用 daemon 中的 api,这样我们就不需要让用户登录然后调用 api,这个流程使应用程序本身可以调用 microsoft graph api。但是使用这个流程会导致你不能再使用me的问题,因为你从来没有登录过,所以我们应该改用/users/userPrincipalName/calendars。

    然后来编程模块,微软提供了调用api的graph SDK,这个在api document也可以看到。您可以参考this document 了解有关如何将客户端凭据流与图形 SDK 一起使用的更多详细信息。您也可以在下面复制我的代码。

    using Azure.Identity;
    using Microsoft.Graph;
    
    public IActionResult Privacy()
    {
        var scopes = new[] { "https://graph.microsoft.com/.default" };
        var tenantId = "your_tenant_name.onmicrosoft.com";
        var clientId = "azure_ad_app_client_id";
        var clientSecret = "client_secret";
        var options = new TokenCredentialOptions
        {
            AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
        };
        var clientSecretCredential = new ClientSecretCredential(
            tenantId, clientId, clientSecret, options);
        var graphClient = new GraphServiceClient(clientSecretCredential, scopes);
        var res = graphClient.Users["your_user_id_which_looks_like_xxxx-xxx-xxx-xxxx-xxxxxx"].Calendars.Request().GetAsync().Result;
        return View();
    } 
    

    顺便说一句,如果你对流程不熟悉,可以看看我的this answer。

    【讨论】:

      【解决方案3】:

      在与 Azure 技术人员交谈后,我能够解决这个问题。原来,我的 Azure 帐户被认为是个人帐户。这显然是因为我首先使用个人@yahoo.com 电子邮件来设置 Azure 帐户。因此,他们显然不允许我购买 o365 并获得许可。因此,我必须使用 S3 的亚马逊默认域创建一个新帐户 - awsapps.com,这是我从 AWS S3 订阅中获取的。然后,我必须完成从现有 S3 自定义域在 Azure 中创建新电子邮件的整个过程。 创建电子邮件后,我可以购买 o365 基本许可证(目前为试用版),然后使用新电子邮件登录 Azure。 o365 购买使我可以访问 Outlook,然后使用刚刚工作的新凭据从快速入门重新创建一个新的守护程序应用程序。 我不知道我所做的是否有意义,因为这听起来非常令人费解。但它似乎最终奏效了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-25
        • 2021-01-26
        • 2021-04-12
        • 1970-01-01
        • 2017-07-15
        • 1970-01-01
        相关资源
        最近更新 更多