【问题标题】:How do I create an auth token with the new microsoft graph api?如何使用新的 microsoft graph api 创建身份验证令牌?
【发布时间】:2015-11-18 22:12:49
【问题描述】:

我一直在用这个:

https://github.com/Azure-Samples/active-directory-php-graphapi-web.git

访问图形 api,它有效。我的 azure AD 注册应用程序能够查询 API 以获取目录中的用户列表。

但现在我想列出目录中用户的文件夹。 本页

http://graph.microsoft.io/docs

说网址应该是:

https://graph.microsoft.com/v1.0/me/drive/root/children

当我在 REST 调用中使用该 url 时,我得到了

"code": "InvalidAuthenticationToken",
"message": "CompactToken parsing failed with error code: -2147184105"

有道理,它从

获取令牌
https://graph.windows.net

所以,我迷路了。 API 有很多不同的版本,从消费级 onedrive(以前称为 skydrive)、第一个图形 api(我通过 https://graph.windows.net 访问)、office 365 API(我通过https://login.microsoftonline.com 访问)和现在的图形api(以前的通用apihttps://graph.microsoft.com)我只是不知道从哪里开始寻找正确的信息。

我目前正在使用 PHP,而且我确信在微软支持的平台列表中这将是相当低的,但是关于访问令牌生成如何在最新 api 与 o365 api 与其他图形 api(位于 graph.windows.net)将不胜感激。

还有人和我一样困惑吗? 是否有一些中心参考资料解释了这些 api 之间的所有差异以及如何访问它们?

【问题讨论】:

    标签: php azure office365 azure-ad-graph-api microsoft-graph-api


    【解决方案1】:

    Microsoft Graph 应该为您提供一个端点(和令牌获取)来访问 Office 365 和 Azure AD 服务提供的数据。请访问https://graph.microsoft.com了解更多详情 - 但请使用 v1.0 版本,因为这是适合生产服务的 GA 版本。

    至于您关于没有用户 UI 的服务应用程序的问题 - 您可以使用 client_credential 流获取仅限应用程序的访问令牌。 (这在 Microsoft Graph 文档中目前没有记录,但它受到支持和描述 elsewhere - 只需将资源设置为 https://graph.microsoft.com/)。在 Azure 管理门户中,您还需要选择您的应用程序也需要的“应用程序权限”。目前支持仅应用程序访问邮件资源,但不支持仅应用程序访问一个驱动器资源(通过 Microsoft graph)。我们会尽快开放它。

    希望这会有所帮助,

    【讨论】:

    【解决方案2】:

    https://login.microsoftonline.com 的端点是 Azure AD 授权端点,它提供 SSO 页面供用户登录和验证并获取授权码。

    https://graph.microsoft.com 等其他资源端点是基于 REST API 构建的,并提供来自 Microsoft 的资源和服务。

    具体到端点https://graph.windows.net,官网的解释是:

    Azure Active Directory Graph API 通过 REST API 端点提供对 Azure Active Directory 的编程访问。应用可以使用 Azure AD Graph API 对目录数据和目录对象(例如用户、组和组织联系人)执行创建、读取、更新和删除 (CRUD) 操作。 https://graph.mircosoft.com 是一个统一的 API,其中还包括来自其他 Microsoft 服务(如 Outlook、OneDrive、OneNote、Planner 和 Office Graph)的 API,所有这些都通过具有单个访问令牌的单个端点进行访问。

    请参阅AD Graph REST 了解更多信息。

    要通过 Azure AD 集成 office 365,您必须检查您是否有 office 365 租户,并且您的 office 365 租户管理员用户是否具有 Azure AD 的访问权限。您可以参考Deep Dive into the Office 365 Unified API 获取集成office 365 统一API 的分步指南。

    此外,您可以参考Get started with Office 365 APIs powered by Microsoft Graph 来创建一个PHP 示例。

    【讨论】:

    • 感谢您的信息,我忘了说,我正在编写一个服务器应用程序,没有用户 UI 交互。我对 AD 具有管理员访问权限,我可以查询图形 API 以获取用户列表。现在我想遍历这些用户并阅读他们的邮件并列出他们的 onedrive 文件。如果我理解正确的话,onedrive 是 o365 api,而邮件是图形 api。但如果可能的话,我想使用新的通用 API。是吗?
    • 要集成 Microsoft 图形 API,您仍然需要为您的应用程序管理员授权。具体到您的要求,我认为这是积极的。我在graph.microsoft.io/docs/api-reference/beta/resources/drive 找到了onedrive API,还在graph.microsoft.io/docs/api-reference/beta/resources/message 找到了邮件API。此外,您可以在API explorer 测试这些 API
    【解决方案3】:

    我真的很努力地导入 Live Outlook 联系人。但经过几天的研发后,我发现https://dev.office.com/blogs/outlook-rest-api-v1-0-office-365-discovery-and-live-connect-api-deprecation 让我切换到 microsoft graph。我也尝试过使用 azure 文档和其他东西,但我发现它非常令人困惑,但我仍然不清楚。所以我已经在 php 中实现了以下内容,结果幸运地成功了。只需按照以下步骤操作: 1) 在https://apps.dev.microsoft.com 中创建您的应用程序 a) 生成新密码。将应用程序 ID 和密码保存在您身边。 b) 将平台添加为 web 并添加带有 https 的重定向 url,因为只能使用 https 而 http 不适用。 c) 检查高级选项下的实时 SDK 支持并保存。

    2) 将 url 中的范围作为 contacts.read 传递,因为我们需要登录用户的联系人。

      $client_id="YOUR_CLIENT_ID";
     $redirect_uri = SiteUrl.'hotmail-contact';
                 $url="https://login.microsoftonline.com/common/oauth2/v2.0/authorize?
                        client_id=".$client_id."
                        &response_type=code
                        &redirect_uri=".$redirect_uri."
                        &response_mode=query
                        &scope=offline_access%20user.read%20mail.read%20contacts.read
                        &state=12345";
    

    3) 认证成功后,返回认证码。现在,在获取代码后,我们通过在https://login.live.com/oauth20_token.srf 的 curl 发布请求获取令牌请求,其中 postfields 为

      $fields=array(
          'code'=>  urlencode($auth_code),
          'client_id'=>  urlencode($client_id),
          'client_secret'=>  urlencode($client_secret),
          'redirect_uri'=>  urlencode($redirect_uri),
          'grant_type'=>  urlencode('authorization_code')
        );
    

    4) 获取联系人

    $url = 'https://graph.microsoft.com/v1.0/me/contacts' 我们甚至可以对它们应用过滤器

    现在用参数 url 和 token 请求 curl

      public function curl_use_token($url,$token) {
    
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
      //  curl_setopt($ch,CURLOPT_HTTPHEADER,array('HeaderName: HeaderValue'));
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization:Bearer '.$token));
      //  curl_setopt($ch, CURLOPT_HTTPHEADER, array("Authorization", "Bearer " + $token));
        curl_setopt($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    
        $data = curl_exec($ch);
        curl_close($ch);
        // print(gettype($data));
        // print($data);
        return $data;
      }
    

    5) 获取数据后,返回的数据不会是纯 json 格式,因此我们可以通过应用正则表达式从数据中仅提取 json 部分,解码后我们可以使用它。 感谢阅读

    【讨论】:

    • 它的工作...谢谢
    • @saloni wadhwa.. 2) 是 curl 调用还是什么?
    猜你喜欢
    • 1970-01-01
    • 2017-09-20
    • 2016-10-19
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 2016-09-06
    相关资源
    最近更新 更多