azure - 无法使用工作帐户访问 Office 365 中的日历

标签 azure office365 microsoft-graph-api

这就是我正在做的事情。

我想开发一个应用程序,可以通过 Microsoft Azure 使用 Microsoft Graph API 访问和管理 Office 365 租户中的日历。该公司拥有 Office 365 商业版,拥有 10 个用户并可以访问 Azure Active Directory。我正在使用 python 3.5 和 requests 库来布局 授权代码授予流程。

我已在 Windows Azure Active Directory 中注册了我的应用程序,并为该应用程序提供了所需的所有访问权限以及回复 URL。客户端 key 也已发布。

我阅读了以下链接: https://graph.microsoft.io/en-us/docs/authorization/app_authorization

<小时/>

这里是我遵循的过程:

首先,获取授权码:

def triggerAutorization(request):
state = str(uuid4())
payload = { 
"client_id": client_id, 
"response_type": "code", 
"state": state, 
"redirect_uri": "http://localhost:8000/authorized",
"prompt": "consent"
}
url = "https://login.microsoftonline.com/{tenant}/oauth2/authorize?" + urllib.parse.urlencode(payload)
return  HttpResponseRedirect(url)

其次,获取token

def requestToken(request):
    headers = { 'Content-Type' : "application/x-www-form-urlencoded"}
    post_data = {
    "client_id": client_id,
    "client_secret": client_secret,
    "code" : request.session['code'],
    "redirect_uri" : "http://localhost:8000/authorized",
    "grant_type": "authorization_code",
    "resource": "https://graph.microsoft.com/"
    }
    raw_response = requests.post("https://login.microsoftonline.com/{tenant}/oauth2/token?",  data=post_data, headers= headers)
    json_response = raw_response.json()
    if json_response['access_token']:
        request.session['access_token'] = json_response['access_token']

    return HttpResponseRedirect('/createquote')

第三,一切都很好,我获得了访问 token 以及访问日历的权限(我想):

'scope': 'Calendars.Read Calendars.Read.All Calendars.Read.Shared Calendars.ReadWrite Calendars.ReadWrite.All Contacts.Read.Shared Directory.AccessAsUser.All Directory.Read.All Files.Read Files.Read.All Files.Read.Selected Files.ReadWrite Files.ReadWrite.All Mail.Read Mail.ReadWrite.All Mail.Send Mail.Send.All openid profile User.Read User.Read.All User.ReadBasic.All', 
'expires_on': '1485932306', 
'refresh_token': 'AQAB..', 
'resource': 'https://graph.microsoft.com/', 
'token_type': 'Bearer', 
'expires_in': '3600', 
'ext_expires_in': '0', 
'not_before': '1485928406', 
'access_token': 'eyJ0...', 
'id_token': 'eyJ0...'

第四,问题来了,当我尝试进行 api 调用时,因为响应是 500 服务器错误,没有任何有意义的细节。

def getCalendarList(request):

    token = request.session['access_token']
    headers = { 
    'User-Agent' : 'pythoncontacts/1.2',
    'Authorization' : 'bearer {0}' . format(token ),
    'Content-Type' :"application/json;odata.metadata=minimal;odata.streaming=true"
}
    request_id = str(uuid.uuid4())
    instrumentation = { 'client-request-id' : request_id,
                        'return-client-request-id' : 'true' }
    headers.update(instrumentation)
    raw_response = requests.get("https://graph.microsoft.com/v1.0/me/calendars", headers = headers)
    json_response = raw_response.json()
    return HttpResponse(" %s" %str(json_response))

有趣的是,当我用“https://graph.microsoft.com/v1.0/me/ ”更改 api 调用时,它就可以工作了。

社区,我希望你能帮助我。我阅读了大量文档并尝试了不同的方法,但我无法让它发挥作用。

非常感谢。

非常感谢您的关注。

最佳答案

我已经找到解决办法了。这恰好是我的 Office 365 计划。使用“Office 365 商业版”创建的用户无法完整使用 Microsoft Graph。经过大量研究后,我注册了 Business Premium 订阅试用版。我根据该计划创建了一个用户,然后使用该帐户登录,最终获得了他的日历。此外,我更改了流程以使用 V2.0 端点。

有趣的是,有时,Microsoft 服务错误响应并不能解释问题的真正原因。

对于可能需要处理相同问题的其他开发人员,请注意实际与 Microsoft Graph 和 Azure AD 配合使用的业务计划。

Office 365 中型企业版(现称为 Office 365 商业高级版) Office 365 企业版 E1、E3、E4 或 K1 Office 365 教育 Office 365 开发人员

欲了解更多信息,请访问以下网址:

https://msdn.microsoft.com/en-us/office/office365/howto/setup-development-environment#bk_Office365Account

我很乐意发布适合我的代码。 最后,请原谅语法或语义错误。

感谢所有社区。

关于azure - 无法使用工作帐户访问 Office 365 中的日历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41974827/

相关文章:

Azure 移动服务 - 使用具有复杂类型参数的 POST 操作

outlook - 通过 Office365 API 获取按 conversationId 过滤的消息

javascript - Microsoft Graph API - v1.0/me/events 禁止 403

azure - 如何为 Azure 中的不同插槽使用不同的 Web.config 文件

c# - 将通知模板从应用程序后端注册到 Azure 通知中心

azure - 使用虚拟网络部署容器实例的步骤

email - 我应该使用 GRAPH API 还是简单的 SMTP 类来创建电子邮件?

PHP imap_搜索 : UTF-8/Non-ASCII characters on Microsoft Exchange mail servers

javascript - 如何使用javascript实现登录xbox?

c# - 无法从特定日历中获取事件