【问题标题】:Cannot get access to Calendars in Office 365 using work account无法使用工作帐户访问 Office 365 中的日历
【发布时间】:2017-02-02 15:40:28
【问题描述】:

这就是我正在做的。

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

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

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


这里,我遵循的过程:

首先,获取Autorization代码:

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

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

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

非常感谢提前。

非常感谢您的关注。

【问题讨论】:

  • 您能否确认您可以在outlook.offfice365.com 看到此用户的默认日历?此外,从您的描述中不清楚他们是否拥有或使用 Exchange Online。
  • 感谢 Marc LaFleur。 !! :-)

标签: azure office365 microsoft-graph-api


【解决方案1】:

我找到了解决方案。这恰好是我的 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

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

感谢所有社区。​​p>

【讨论】:

    【解决方案2】:

    我还没有原始完成整个过程,我确信必须有一些 oath2 库来帮助在更高级别上工作,而无需自己编写标头。 MSFT 的人 jasonjoh 有一个很棒的教程,即使他使用 django。您如何存储令牌?我认为它们超过 4k!

    希望对你有帮助

    【讨论】:

    • 对了,或许你应该看看 v2 API link
    • 听起来这不是 OAUTH/token 进程的问题。一旦你调用了 Graph 端点,他就已经通过了身份验证。我希望看到一个 HTTP 401 - 如果它是令牌本身,则未经授权。
    猜你喜欢
    • 1970-01-01
    • 2014-11-07
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多