通过另一个Rest服务调用Microsoft图形api

时间:2018-08-16 08:14:00

标签: azure postman microsoft-graph office365api azure-ad-graph-api

美好的一天!

我们需要一个日历工具来处理我们当前正在处理的项目。由于某些原因,我们仅限于使用Office 365日历或Outlook日历。我们偶然发现了Microsoft Graph API,这似乎是实现我们想要做的正确工具。因此,我们的想法是创建一个Microsoft帐户,该帐户将用作主日历,我们的包装器(用于包装Microsoft图形API调用)将可以从该日历中提取事件,并最终将其分发给客户端请求。

这就是到目前为止我们所做的:

  1. 创建一个域为@ outlook.com的Microsoft帐户
  2. 使用该Microsoft帐户绘制一些日历事件
  3. 试图从Microsoft网站上遵循此guide

我们同意创建一个包装器API,该包装器将调用Microsoft Graph API,但在此之前,我们尝试通过邮递员访问所述API。问题在于邮递员无法从/ authorize API的端点获得任何响应,而该端点需要获得访问令牌才能最终调用相应的Microsoft graph API。

现在我们不知道我们是否试图错误地进行攻击或进行其他任何攻击。您知道我们在这里缺少什么吗?在此先感谢您,我希望有人能对此事有所启发。

更新:

我们取得了一些进展。一段时间后,我们碰到了Azure活动目录门户。现在,我们可以使用此URL获取访问令牌。

https://login.microsoftonline.com/<directory-id>/oauth2/token

现在,当我们访问应该调用的实际MS Graph API端点时,即使我们正在使用从上一个API调用获得的令牌,也将收到 401未经授权响应。这是我们试图获得响应的URL:

https://graph.microsoft.com/v1.0/me/calendar/calendarView?startDateTime=2018-08-01T00:00:00.0000000&endDateTime=2018-08-31T23:59:59.0000000

这些都是先通过邮递员完成的。

更新:

我们尝试授予Azure Active Directory门户中所有可能的权限,并在以下位置确认同意

https://login.microsoftonline.com/<domain>.onmicrosoft.com/adminconsent?client_id=<client-id>

但不幸的是,我们仍然遇到401 Unauthorized墙。在Microsoft Graph Explorer中,一切正常。那么,在我们的邮递员实现中,MS Graph Explorer隐式做了什么?预先感谢您的帮助!

更新

进一步阅读后,我们发现了一些重要的细节。首先,我们发现Microsoft提供了两组API。一种是Azure Active Directory API,另一种是Microsoft Graph API。这两个API使用相同的URL来通过客户端凭据获取访问令牌。以下是网址:

https://login.microsoftonline.com/<directory-id>/oauth2/v2.0/token

使用Azure门户中的个人数据替换。使用此URL获取访问令牌,您需要在请求正文中提供一些数据。

  1. client_id-天蓝色门户中已注册应用程序的客户端ID
  2. client_secret-天蓝色门户中已注册应用程序的密钥
  3. grant_type-'client_credentials'->表示您将使用客户端凭据获得访问令牌
  4. 范围-'https://graph.microsoft.com/.default'或'https://graph.windows.net/.default'->这可控制您要访问的API。第一个是访问Microsoft Graph API,另一个是访问Azure Active Directory API。

我们现在可以获取访问令牌,并使用它来访问所需的实际API。以下是上述API的网址:

https://graph.microsoft.com/v1.0/users/<azure-tenant-name>.onmicrosoft.com/calendar/calendarView?startDateTime=2018-08-01T00:00:00.0000000&endDateTime=2018-08-31T23:59:59.0000000

请注意,该URL不使用/me,因为使用该URL时需要登录用户。不幸的是,我们仍然收到401未经授权的错误,但现在这些错误确实发生了变化。我们断断续续地犯错误。有时,API调用会交替返回一个或另一个。下面是API调用的返回。

{
    "error": {
        "code": "InvalidTenant",
        "message": "The tenant for tenant guid '<directory-id-goes-here>' does not exist.",
        "innerError": {
            "request-id": "<some-request-id>",
            "date": "2018-08-22T04:29:27"
        }
    }
}

{
    "error": {
        "code": "UnknownError",
        "message": "",
        "innerError": {
            "request-id": "<some-request-id>",
            "date": "2018-08-22T04:54:11"
        }
    }
}

我们认为我们已经向前迈进了一步。我们仍然没有得到我们需要的东西。现在,这两个API调用响应是个谜。这可能是什么原因?预先感谢任何人的帮助

更新

在进一步阅读后,我们发现存在用于获取访问令牌的身份验证流程。根据您要调用的API,某些身份验证流将无法使用,因为它们需要更多详细信息和安全性才能执行自己。所以我们尝试了:

  1. 客户凭证授予
  2. 资源所有者凭证授予
  3. 授权代码授予

但是,不幸的是,我们仍然陷于先前的错误中。我们收到 401未经授权的消息,响应有效载荷为InvalidTenantUnknownError

1 个答案:

答案 0 :(得分:1)

昨天我刚刚遇到了类似的问题,即401未经授权错误。

我试图通过Microsoft的Graph API访问员工的日历,但收到的回复与您相同。

请求:

https://graph.microsoft.com/v1.0/users/employee-email/calendarview?startdatetime=2018-10-21T00:00:00Z&enddatetime=2018-10-27T23:59:59Z&$select=subject,categories,start,end,sensitivity

响应:

{
    "error": {
        "code": "UnknownError",
        "message": "",
        "innerError": {
            "request-id": "<request-id>",
            "date": "<date>"
        }
    }
}

然后我决定检查是否有Office365。他没有。我只是一名开发人员,所以我请基础结构人员在empleyee的计算机上安装Office 365,或将其添加到enterprice帐户中。

完成后,对他的日历的请求就可以了:)