使用没有UI的Office 365 REST API

本文关键字:Office REST API UI | 更新日期: 2023-09-27 18:05:06

我需要将日历条目推送到客户端的Outlook帐户。这在Exchange中是相当直接的。您只需使用具有访问权限的用户进行身份验证,然后就可以将条目推送到其他用户的帐户中。在Office 365中似乎完全不同。

我试着遵循这里的说明:https://dev.outlook.com/restapi/getstarted

我创建了应用程序并获得了应用程序的客户端ID。但是,所有的文档都是围绕oAuth的。一般来说,oAuth是为这样的场景设计的:用户需要通过浏览器窗口输入他们的凭据,然后浏览器窗口将与用户确认他们愿意允许应用程序拥有哪些凭据。

这与我的场景不匹配。我需要能够将日历条目推到没有任何用户界面的帐户。这是后端集成。它只需要默默地完成它的工作。

我看了这个示例应用程序:https://github.com/OfficeDev/O365-Win-Snippets

但是,这是一个前端应用程序。当它需要认证时,它会弹出一个窗口强制用户输入他们的凭据。

当我尝试调用入门页中提到的REST API时,它返回HTML。这是它提到的Url:

https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=& redirect_uri = http % 3 a % 2 f % 2 flocalhost % 2 fmyapp % 2的范围response_type = code& 3 = https % % 2 f % 2 foutlook.office.com % 2 fmail.read

我已经尝试了这个Url与我的客户端ID的一些排列。我已经尝试过通过基本的http身份验证来传递我的Office 365凭据。

我困。

使用没有UI的Office 365 REST API

答案很简单。使用Exchange API,而不是Office 365 API。

我很困惑,因为我以为Office 365和Exchange是不同的实体,但Office 365电子邮件服务器只是一个巨大的Exchange服务器。下面是一些示例代码。这是一个登录到Office 365的Exchange服务器并将日历条目发送到电子邮件地址的示例。简单。

我做了一个疯狂的猜测关于交换Url,它是正确的:https://outlook.office365.com/ews/exchange.asmx

    //Connect to exchange
    var ewsProxy = new ExchangeService(ExchangeVersion.Exchange2013);
    ewsProxy.Url = new Uri("https://outlook.office365.com/ews/exchange.asmx");
    //Create the meeting
    var meeting = new Appointment(ewsProxy);
    ewsProxy.Credentials = new NetworkCredential(_Username, _Password);
    meeting.RequiredAttendees.Add(_Recipient);
    // Set the properties on the meeting object to create the meeting.
    meeting.Subject = "Meeting";
    meeting.Body = "Please go to the meeting.";
    meeting.Start = DateTime.Now.AddHours(1);
    meeting.End = DateTime.Now.AddHours(2);
    meeting.Location = "Location";
    meeting.ReminderMinutesBeforeStart = 60;
    // Save the meeting to the Calendar folder and send the meeting request.
    meeting.Save(SendInvitationsMode.SendToAllAndSaveCopy); 

我的理解是这是可能的,但是身份验证看起来相当复杂。首先,任何需要Office 365集成的应用程序也必须与关联的Azure AD集成。您可以为特定用户注册您的应用程序,以便它具有您需要执行的任何操作所需的权限。请参阅此处查看该组件的良好摘要:https://msdn.microsoft.com/en-us/office/office365/howto/connect-your-app-to-o365-app-launcher?f=255&MSPPError=-2147217396#section_2

对于身份验证,您需要一个守护进程/服务器应用程序模型。我还没有尝试过这样做,但这里有文档记录,看起来应该可以满足您的需求(请参阅守护程序或服务器应用程序到Web API一节):https://azure.microsoft.com/en-us/documentation/articles/active-directory-authentication-scenarios/#daemon-or-server-application-to-web-api

为了调用Office 365 REST API,应用程序需要Azure Active Directory的访问令牌,这就是为什么你需要(强制)在Microsoft Azure Active Directory (Azure AD)中注册应用程序。反过来,您的Office 365帐户需要与Azure AD相关联。这个答案总结了如何在Azure AD中注册应用程序以使用Office 365 API。

Basic认证方案

关于Basic认证,目前在API版本1.0是启用的,下面的例子演示了如何在。net应用程序中使用Outlook Calendar REST API。

先决条件:

domain: https://outlook.office365.com/
API version: v1.0

下面是一个获取日历并打印其名称的示例

private static async Task ReadCalendars()
{
    var handler = new HttpClientHandler();
    handler.Credentials = new NetworkCredential()
    {
        UserName = ConfigurationManager.AppSettings["UserName"],
        Password = ConfigurationManager.AppSettings["Password"]
    };
    using (var client = new HttpClient(handler))
    {
        var url = "https://outlook.office365.com/api/v1.0/me/calendars";
        var result = await client.GetStringAsync(url);
        var data = JObject.Parse(result);
        foreach (var item in data["value"])
        {
            Console.WriteLine(item["Name"]);
        }
    }
}