如何使用新的microsoft graph api创建身份验证令牌?

时间:2015-11-18 22:12:50

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

我一直在用这个:

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

访问图形api,它有效。我的Azure注册应用程序能够查询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(以前的通用api https://graph.microsoft.com)我只是不知道从哪里开始寻找正确的信息。

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

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

3 个答案:

答案 0 :(得分:4)

Microsoft Graph应为您提供一个端点(和令牌获取),以访问Office 365和Azure AD服务提供的数据。有关详细信息,请访问https://graph.microsoft.com - 但请使用v1.0版本,因为这是适用于生产服务的GA版本。

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

希望这有帮助,

答案 1 :(得分:3)

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

https://graph.microsoft.com这样的其他人是一个资源端点,它建立在REST API之上,并提供来自Microsoft的资源和服务。

具体来说,对于端点https://graph.windows.net,官方网站上的解释是:

  

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

有关详细信息,请参阅AD Graph REST

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

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

答案 2 :(得分:0)

我真的很努力地导入实时展望联系人。但经过几天的R& DI发现https://dev.office.com/blogs/outlook-rest-api-v1-0-office-365-discovery-and-live-connect-api-deprecation让我转向微软图。我也尝试过使用azure文档和其他东西,但我发现它非常令人困惑,但我仍然不清楚所以我在php中实现了以下内容,结果幸运地成功了。只需按照以下步骤操作:1)在https://apps.dev.microsoft.com中创建应用程序a)生成新密码。随身携带应用程序ID和密码。 b)将平台添加为web并使用https添加重定向URL,因为只能使用https且http不适用。 c)检查高级选项下的Live 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 post请求获得了令牌请求,其中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'   我们甚至可以对它们应用过滤器

现在请求curl with paramaters url和token

  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部分,并且在解码后我们可以使用它。    感谢您的阅读