Microsoft Graph API请求

时间:2017-03-22 19:28:10

标签: azure-active-directory microsoft-graph azure-ad-graph-api

我正在尝试在我的企业中开发应用,并且我已跟随this tutorial访问AD用户信息。含义:

  1. 我在https://apps.dev.microsoft.com/
  2. 中创建了一个应用
  3. 我在申请权限中设置了User.Read.All,在委托权限
  4. 中设置了User.Read

    完成此操作后,我能够成功登录(Azure AD OAuth2,https://graph.microsoft.com/作为资源,User.Read作为范围),并从https://graph.microsoft.com/v1.0/me获得正确的响应。

    1. 向管理员询问委派权限
    2. 有了这个,我的管理员可以在azure portal中看到我的应用程序拥有自己同意的权限。

      这是有效的,因为我要求同事登录,我可以从https://graph.microsoft.com/v1.0/me得到正确的答复,即使他甚至没有提示同意这一点(在管理员同意用户权限之前)提示)

      1. https://login.microsoftonline.com/common/oauth2/token申请client_credentials作为response_type

      2. 的令牌
      3. 收到令牌!

      4. https://graph.microsoft.com/v1.0/users发送GET请求并收到:

        {
            "error": {
                "code": "Authorization_IdentityNotFound",
                "message": "The identity of the calling application could not be established.",
                "innerError": {
                    "request-id": "b2d9ec62-0b65-44eb-9e0f-4aec52b45750",
                    "date": "2017-03-22T19:19:48"
                }
            }
        }
        
      5. 此外,向https://graph.microsoft.com/v1.0/me发出请求会返回:

        {
          "error": {
            "code": "BadRequest",
            "message": "Current authenticated context is not valid for this request",
            "innerError": {
              "request-id": "047e2ba9-a858-45fc-a0dd-124e1db503f3",
              "date": "2017-03-22T19:39:25"
            }
          }
        }
        

        这让我相信微软知道这个令牌,并且知道它并没有冒充任何用户。

        我一直在寻找有关Azure AD和Microsoft Graph身份验证的文档,但我只发现博客帖子,所有内容都过时了(尽管大多数功能都在预览中)。 如果你能指出我正确的方向,我会感谢你。

        我在SO上也发现了thisthis类似的问题,但它们都没有答案。

        this answer

        之后更新

        谢谢Dan, 我已经使用了我的组织域名,我也能够获得令牌。

        现在https://graph.microsoft.com/v1.0/users/的回复是:

        {
          "error": {
            "code": "Authorization_RequestDenied",
            "message": "Insufficient privileges to complete the operation.",
            "innerError": {
              "request-id": "3f190b47-73f5-4b29-96f9-54ed3dbc3137",
              "date": "2017-03-23T11:07:15"
            }
          }
        }
        

        这没有任何意义,因为在azure门户网站中我有User.Read.All作为应用程序权限(已经得到管理员同意)。

        我认为问题在于令牌的请求,无论我发送的scope是什么,即使我做了一个,也会成功返回。

        例如:

        POST https://login.microsoftonline.com/<domain>/oauth2/token
        
        client_id:*******
        client_secret:*******
        resource:https://graph.microsoft.com/
        grant_type:client_credentials
        scope:Foo.Bar
        

        返回:

        {
          "token_type": "Bearer",
          "expires_in": "3599",
          "ext_expires_in": "0",
          "expires_on": "1490271617",
          "not_before": "1490267717",
          "resource": "https://graph.microsoft.com/",
          "access_token": *****
        }
        

2 个答案:

答案 0 :(得分:3)

我有两个问题,都没有涵盖文档:

  • 对于客户端凭据,如果应用属于工作或学校(组织)上下文,则https://login.microsoftonline.com/common/oauth2/tokencommon替换为tenantId或域名(感谢Dan Kershaw

  • 对于https://graph.microsoft.com/v1.0/usershttps://graph.microsoft.com/v1.0/users/{id | userPrincipalName},您需要Directory.Read.All权限。

注意

    当您在OAuth工作流程中要求User.Read.All时,
  • User.Read与Microsoft停止向用户请求权限(委派)相关。在Release Notes
  • 中查看此问题及其他与权限相关的问题
  • 我已将此issue添加到Microsoft Graph Docs!

答案 1 :(得分:1)

/me段是当前登录用户的快捷方式或别名。对/me的请求将永远不会与应用程序令牌一起使用,因为它不包含任何用户上下文(或登录用户) - 因此错误。我们或许能够改善这个错误;)

相信在使用客户端凭据流时,您需要指定您想要令牌的实际租户。

如果您的应用正在工作或学校(组织)上下文中执行此操作,那么https://login.microsoftonline.com/common/oauth2/tokencommon替换为tenantId或域名,并查看是否有效。

如果您关注https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-protocols-oauth-client-creds,我们可能会遇到一些我们需要解决的doc bug ...

希望这有帮助,