我们编写了一个服务应用程序,它从组织(租户)的多个日历中读取 Office 365 日历信息,并对条目进行一些分析。为此,我们使用 Office 365 REST API。
我们有多个客户端组织(租户)需要此功能,因此我按照此处的@Matthias Leibmann文章中的步骤操作:使用 Office 365 邮件、日历和联系人 API 构建守护程序或服务应用程序(OAuth2 客户端凭据流)
我们在开发过程中使用了 Azure 试用帐户和 Office 365 试用订阅,一切运行良好,我们已经成功访问了多个租户的数据。
但是,当我尝试使用我们的生产 Azure 帐户和生产 Azure Active Directory (AAD) 设置多租户应用程序时,我意识到我无法在“权限”中定义“Office 365 Exchange Online”所需的应用程序权限。其他应用程序”部分,因为我们的生产 AAD 帐户未链接到 Office 365 帐户。
我假设我们可以使用我们的生产 azure 帐户注册 Office 365 的开发人员试用版,这将允许我们设置所需的权限,但我不知道 Office 365 试用版到期后 30 天会发生什么。
有没有办法在不将 Office 365 帐户链接到我们的生产 AAD 的情况下定义这些必需的权限?
这只是 Azure 前端的工具问题,还是存在技术原因,即使我们总是连接到其他公司的 Office 365 帐户,我们也需要自己的 Office 365 订阅?
我在想办法在 Office 365 上获取“已取消”的事件时遇到了麻烦。这似乎是一件非常基本的事情,但是我试图找出如何做到这一点的尝试都没有奏效。
阅读 Office 365 API 文档,我可以看到该Event
资源具有IsCancelled
布尔属性,该属性应显示true
事件是否已取消/删除。
我已经尝试了多种通过 API 获取事件的方法,但都没有成功。似乎一旦一个事件被取消,它就会从返回的结果中删除。
我还看到我可以使用OData 查询参数来尝试过滤事件获取响应的结果,所以我什至尝试$filter=IsCancelled eq true
在请求上设置查询参数,但我得到的只是一个带有空数据数组的响应。:/
有什么明显的我遗漏了吗?这里的文档很简单。
outlook calendar exchangewebservices office365 outlook-restapi
任何人都可以帮助我使用 Microsoft Graph API 创建一个事件。
理想的行为是添加一个指向事件的链接,该链接在大多数日历客户端中都是可点击的。这是我使用的事件有效负载的示例:
{
...
"body": {
"ContentType": "HTML",
"Content": "<a href=\"https://somelink.com\">Start Online Meeting</a>"
},
"onlineMeetingUrl": "https://somelink.com"
}
Run Code Online (Sandbox Code Playgroud)
此有效负载作为 POST 请求发送到 https://graph.microsoft.com/v1.0/me/events
目前的回应是:
{
...
'onlineMeetingUrl': null,
...
}
Run Code Online (Sandbox Code Playgroud)
和事件的详细信息在日历应用程序中不可点击并以纯文本形式显示
Start Online Meeting
或转换为
Start Online Meeting <https://somelink.com>
在谷歌日历中
感谢帮助!
我正在构建一个基于React的Outlook加载项.我使用YeomanGenerator设置我的项目.我正在尝试使用Office-Js-Helpers设置身份验证.我能够创建验证器,注册microsoftAuth端点.我的添加打开对话框,我能够登录等,并在对话框的URL中返回访问令牌,但对话框永远不会关闭,并且我尝试进行身份验证后获取我的令牌是success
/ then
function从未打过.如果我手动关闭对话窗口,catch
则触发.
我不知道我是否正确设置我的项目.这是main.tsx
我打开加载项时第一个加载的页面中的代码.这是代码(有一些虚拟数据 - 例如我的clientId是一个实际的,我刚刚阻止了它).我已经在我的应用程序帐户中设置了redirectUrl https://localhost:3000/signin-microsoft
.请告诉我您可能需要的其他信息 - 我100%坚持到这里.
import * as React from 'react'
import { render } from 'react-dom'
import { App } from './components/app'
import { Progress } from './components/progress'
import './assets/styles/global.scss'
import { Authenticator, Utilities, DefaultEndpoints } from '@microsoft/office-js-helpers'
(() => {
const title = 'My App';
const container = document.querySelector('#container');
const clientId = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
/* Render application after Office initializes */
Office.initialize = () …
Run Code Online (Sandbox Code Playgroud) 我正在为 Microsoft ToDo 任务构建一个小型 JS 应用程序,并使用 msal.js 库来适应身份验证过程。这工作得很好,我收到一个弹出窗口,我验证了我的个人资料,弹出窗口关闭,我的任务出现在我的屏幕上。
但是:它好像不记得我之前认证过;每次我运行 webpack 应用程序并且页面启动时,它都会显示弹出窗口并要求身份验证。一旦我通过身份验证并刷新页面,它只会向我显示任务,而不会再次显示弹出窗口。我没有尝试等待一个小时,但我认为这与未正确刷新我的访问令牌有关。我对 Outlook/Microsoft API 的了解并不多,所以我可以真正确定我是否正确使用它。
简而言之:如何进行一次身份验证,以便下次启动应用程序时显示任务而无需再次进行身份验证?
我的初始化函数
this.userAgentApplication = new Msal.UserAgentApplication(microsoftTasksClientId, null, function (errorDes, token, error, tokenType) {
// this callback is called after loginRedirect OR acquireTokenRedirect (not used for loginPopup/aquireTokenPopup)
console.log(token)
})
let user = this.userAgentApplication.getUser()
if (!user) {
const self = this
// this.userAgentApplication = new Msal.UserAgentApplication(microsoftTasksClientId)
this.userAgentApplication.loginPopup([`${this.apiRootUrl}Tasks.readwrite`]).then(function (token) {
self.idToken = token
user = self.userAgentApplication.getUser()
if (user) {
self.getSilentToken()
}
}, function (error) {
console.log(error)
})
} …
Run Code Online (Sandbox Code Playgroud) 我的用例是:制作一个每小时运行一次的脚本,以提取有关用户日历的信息。
我的脚本在 Python 中运行,我获得了一个令牌,但我无法获得用户的事件。我已在Microsoft 应用程序注册门户中注册了我的应用程序并授予了 Calendar.read 应用程序权限。管理员通过访问/adminconsent
端点表示同意。
这是我获取令牌的代码(此处为文档):
url = 'https://login.microsoftonline.com/common/oauth2/v2.0/token'
data = {
'grant_type': 'client_credentials',
'client_id': app_id,
'scope': 'https://graph.microsoft.com/.default', <--- Really not sure about this here
'client_secret': client_secret,
}
r = requests.post(url, data=data)
token = r.json().get('access_token')
Run Code Online (Sandbox Code Playgroud)
我应该使用什么范围?文档只提到了上面的一个。
并阅读用户的日历:
url = 'https://outlook.office.com/api/v2.0/users/{}/events'.format(user_email)
headers = {
'Authorization': 'Bearer {}'.format(token)
}
r = requests.get(url, headers=headers)
Run Code Online (Sandbox Code Playgroud)
我不确定那 users/{user_email}/
部分。
我获得了访问令牌,但在尝试读取用户的日历时出现以下错误:
响应 [401]
访问令牌是使用太弱而无法访问此应用程序的身份验证方法获取的。提供的身份验证强度为 1,要求为 2。
我编写了一个能够与Exchange Online帐户通信的应用程序,我正在尝试测试以查看使其与在Hybrid中运行的内部部署帐户一起使用所需的步骤.
我有:
/PrepareAD
跑)/api/v2.0
和/autodiscover/autodiscover.json
不幸的是,我404
在尝试访问日历活动时遇到了问题:
curl -v -H 'Content-Type: application/json' -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJub25jZSI6IkFRQUJBQUFBQUFCSGg0a21TX2FLVDVYcmp6eFJBdEh6RE1mbEZNYTYwaktGRHRhUXp0ZGVkM2V6Z0ZfUzlLMjdDRmQxSHlfZGdRcnR6WlJBczRDV095R3E1Vl9OZW9MSFNKTGpzblNCSDNCQU9oQnBzU18wVmlBQSIsImFsZyI6IlJTMjU2IiwieDV0IjoiU1NRZGhJMWNLdmhRRURTSnhFMmdHWXM0MFEwIiwia2lkIjoiU1NRZGhJMWNLdmhRRURTSnhFMmdHWXM0MFEwIn0.eyJhdWQiOiJodHRwczovL2dyYXBoLm1pY3Jvc29mdC5jb20iLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC8wODY1YjBhYi02ZjYwLTQzNjMtYTEwZi05NWU5ZTc5ZjlmODEvIiwiaWF0IjoxNTE4OTc5NzQ0LCJuYmYiOjE1MTg5Nzk3NDQsImV4cCI6MTUxODk4MzY0NCwiYWlvIjoiWTJOZ1lKRE0reDVXbGhWNUlrajUwbDB4THNacEFBPT0iLCJhcHBfZGlzcGxheW5hbWUiOiJIQy1XZWIiLCJhcHBpZCI6ImVkZjlkY2M0LThjNjAtNDg3ZS1hYmUyLTI4MjcyYTRlZGJlMCIsImFwcGlkYWNyIjoiMiIsImlkcCI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0LzA4NjViMGFiLTZmNjAtNDM2My1hMTBmLTk1ZTllNzlmOWY4MS8iLCJvaWQiOiJkNTUzMTE2My01MTcxLTRmZjctYTNjMS04NWFlNzUzMjkzNTIiLCJyb2xlcyI6WyJNYWlsLlJlYWRXcml0ZSIsIkNvbnRhY3RzLlJlYWRXcml0ZSIsIkRpcmVjdG9yeS5SZWFkLkFsbCIsIk1haWwuUmVhZCIsIkNhbGVuZGFycy5SZWFkV3JpdGUiXSwic3ViIjoiZDU1MzExNjMtNTE3MS00ZmY3LWEzYzEtODVhZTc1MzI5MzUyIiwidGlkIjoiMDg2NWIwYWItNmY2MC00MzYzLWExMGYtOTVlOWU3OWY5ZjgxIiwidXRpIjoiNkxJT3g1bWQ4ay05ajhBUUtiY2hBQSIsInZlciI6IjEuMCJ9.AWt_ANsH8sk15WeH1AgD6SD0Ki8VILMvzkbSMju_YFGKc5cVkrGp7Skzt64uDM8rI6Py5Y-1c3srXwON2oSihkRskfz5vG4nIlbFnuYd3Ij2Vz1ktpNnCeMAnAK2T8ifk2visRSvchRbuBNZZyamwRjActdDF9BS8NygUgmmygK4mPjOIab17PJPz5PisvRbCA2jBLWLvbu9RYrLH-xGuoLd2PLTbsn2WSVi3er4XztZCcK7XfVWe-0wjrV6qBufd5z0hH_KpQLdzPtLOzSUGUAcXGa0mBPceTWULQvQ-LPcAJO57F0ir5k22fWzlkOfUxQb9eGWREUm1cAPWk3CPw" "https://graph.microsoft.com/v1.0/users/oq@healthcentrified.co.uk/calendar/events"
* Trying 137.116.241.64...
* Connected to graph.microsoft.com (137.116.241.64) port 443 (#0)
* found 148 certificates in /etc/ssl/certs/ca-certificates.crt
* found 592 certificates in /etc/ssl/certs
* ALPN, offering http/1.1
* SSL connection using TLS1.2 / ECDHE_RSA_AES_256_CBC_SHA384
* server certificate verification OK
* server certificate status verification …
Run Code Online (Sandbox Code Playgroud) 卡在这里编写 JS 代码以在自定义 Outlook 加载项中通过 REST 发送电子邮件。
场景如下
report
\
\---- another message (item attachment)
\
\------- attachment (file attachment)
Run Code Online (Sandbox Code Playgroud)
换句话说,我正在发送一条新的报告消息,其中包含另一条消息作为项目附件(工作正常)。
但是现在,问题是,当发送另一条带有附件的消息时,这会失败。打开附加了其他消息的报告不会显示附件。
查询是 POST https://outlook.office365.com/api/v2.0/me/sendmail
已接受退货 202
身体很长,在这个要点上 https://gist.github.com/binarykitchen/2b95331c5c85e7cb4ca6f6917dc67a67
您可以看到 Message has Attachments,其中有一个 Item Attachment(附加另一条消息),其中包含一个名为“bat_kitten.jpeg”的文件附件
为什么这个发送的消息没有这个文件附件,但服务器仍然以接受的 202 响应?
也许有些参数是错误的?不确定要为该文件附件的 ContentId 和 ContentLocation 设置什么?
还是不支持嵌套附件?
任何线索将不胜感激。
我们有一个功能设置为从我们的 Web 应用程序通过 Outlook 发送电子邮件,它运行良好,但今天早上突然我的电子邮件收件箱充斥着来自我们系统的错误,说由于错误的请求,它无法发送带有 Outlook 的电子邮件. 错误看起来像这样:
{"error":{"code":"BadRequest","message":"Invalid OData type specified: \"Microsoft.OutlookServices.FileAttachment\"","innerError":{"date":"2021-07-02T05:43:00","request-id":"XXX","client-request-id":"XXX"}}}
Run Code Online (Sandbox Code Playgroud)
正如我所说,它昨天有效,但现在不行了。并且其中很多在嵌入的标题图像之外没有特定的附件,自从它工作以来就没有改变。
关于错误原因的任何建议?
outlook-restapi ×10
office365 ×3
outlook ×3
azure ×2
office-js ×2
office365api ×2
api ×1
calendar ×1
javascript ×1
oauth-2.0 ×1
python ×1
rest ×1
typescript ×1