这就是我正在做的事。
我想开发一个可以通过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
这里,我遵循的过程:
首先,获取自动化代码:
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通话时它有效。
社区,我希望你能帮助我。我已经阅读了大量文档并尝试了不同的方法,但我无法使其工作。
非常感谢提前。
非常感谢您的关注。
答案 0 :(得分:1)
我找到了解决方案。它碰巧是我的Office 365计划。使用“Office 365商业”版本创建的用户无法完整使用Microsoft Graph。经过大量研究,我报名参加了商业高级订阅试用。我在该计划下创建了一个用户,然后我使用该帐户登录,我终于获得了他的日历。而且,我改变了使用V2.0端点的过程。
有趣的是,有时,Microsoft服务错误响应并不能解释问题的真正原因。
对于可能需要处理同一问题的其他开发人员,请注意实际使用Microsoft Graph和Azure AD的业务计划。
Office 365中型企业(现称为Office 365 Business premium) 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>
答案 1 :(得分:0)
我还没有以原始方式完成整个过程,我确信必须有一些oath2库来帮助更高级别的工作,而无需自己编写标题。尽管他使用了django,但MSFT人jasonjoh提供了很棒的教程。你是如何存储代币的?我认为他们超过4k!
希望这有帮助