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

Cannot get access to Calendars in Office 365 using work account

这就是我正在做的。

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

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

我阅读了以下内容link: 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)

其次,获取令牌

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')

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

'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))

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

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

非常感谢。

非常感谢您的关注。

我还没有以原始方式完成整个过程,我确信一定有一些 oath2 库可以帮助在更高级别上工作而无需自己编写 headers。 MSFT 人 jasonjoh 提供了一个很棒的教程,尽管他使用的是 django。你如何存储令牌?我认为他们超过4k!

希望对您有所帮助

我找到了解决办法。它恰好是我的 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 办公室 365 教育 Office 365 开发人员

有关更多信息,这是 URL:

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

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

感谢所有社区。