无法使用工作帐户

时间:2017-02-01 08:13:24

标签: azure office365 microsoft-graph

这就是我正在做的事。

我想开发一个可以通过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通话时它有效。

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

非常感谢提前。

非常感谢您的关注。

2 个答案:

答案 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

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

感谢所有社区。

答案 1 :(得分:0)

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

希望这有帮助