2016-08-31 91 views
3

我需要将日历条目推入客户端的Outlook帐户。 Exchange对此非常直接。您只需向有权访问的用户进行身份验证,然后就可以将条目推送到其他用户的帐户。这似乎是在Office完全不同的365在没有UI的情况下使用Office 365 REST API

我试图在这里按照指示: 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%3A%2F%2Flocalhost%2Fmyapp%2F & RESPONSE_TYPE =代码&范围= HTTPS%3A%2F%2Foutlook.office.com%2Fmail.read

我用我的客户端ID试过了这个Url的一些排列组合。我试过通过基本的http认证传递我的Office 365凭证。

我被卡住了。

+0

你可以尝试存储令牌,您可以检索当用户登录访问,并使用一个例子访问令牌来执行对API的请求。我相信访问令牌有效期为1小时。您可能想要使用新的Microsoft Graph api btw:http://graph.microsoft.io/en-us/docs/overview/overview – koelkastfilosoof

+0

它不起作用。这是一个后端系统。我们没有任何用户的Outlook凭据,我们从来没有。作为交换,我们只有管理员权限才能将日历条目推入收件箱。 –

+0

我想我已经认识到Office API是一套客户端API,它基本上允许您自动化客户端软件 - 而不是在后端管理类型的东西。我想这就是交换服务的目的。所以,我真的觉得我一直在疯狂追逐。我可以使用交换API来管理组的Office 365帐户吗? –

回答

4

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

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

我在关于交换网址胡乱猜测,这是正确的: 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); 
1

我的理解是,这是可能的,但验证看起来相当复杂。对于初学者来说,任何需要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

+0

这看起来很有希望。调查... –

+0

等待。这是针对Azure的...我假设Office 365和Azure之间存在某种联系,但假设我能够使用Azure进行身份验证,那么如何才能访问Office 365 REST API? –

0

为了调用Office 365的REST API,应用程序需要从Azure中的Active Directory访问令牌,这就是为什么您需要(强制)在Microsoft Azure Active Directory(Azure AD)中注册应用程序。你的Office 365 account in turn needs to be associated with Azure ADThis answer总结了如何在Azure AD中注册应用程序以便使用Office 365 API。

Basic认证方案

改编职系Basic认证,它是目前启用的API版本1.0,下面的例子演示了如何在.NET应用程序消耗​​。

先决条件:

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"]); 
     } 
    } 
} 
+0

我明白你在说什么,但这是误解用例的问题。我正在寻找后端集成解决方案,而Office 365 API则是为前端集成/自动化而设计的。基本认证已经停止,所以它不是一个长期的解决方案。如前所述,长期解决方案是使用Exchange Web API。 –