如何为已登录的用户获取Azure AD访问令牌?

时间:2018-03-16 09:56:21

标签: php azure azure-web-sites azure-active-directory microsoft-graph

我们在Microsoft Azure平台上运行了一个App Service(一个PHP网站)。只有在用户登录后才能访问该网站。身份验证基于Azure AD。一切正常。

现在,从网站的PHP代码中,我想获得已登录用户的Azure AD组成员身份。

我阅读了很多Web资源,解释了如何从网站登录用户到Azure AD,从而获得授权/访问令牌以执行其他操作,例如检索组成员资格和许多其他内容。但这不是我想要的。用户已经登录并可以成功使用该网站。 (否则,Microsoft会将用户重定向到单点登录页面。)

使用PHP,我可以从任何访问网站的请求标题中检索登录用户的用户名。并且在请求标头中还存储了一些“访问令牌”,以及其他内容,例如“客户端主体ID”。但我不知道这是否是我可以用于其他操作的授权/访问令牌。或许/可能我做错了什么。例如,使用cURL请求https://graph.microsoft.com/v1.0/me/memberOf,我在“CompactToken解析失败”时收到InvalidAuthenticationToken错误。我按照here的说明将“授权:承载{访问令牌}”和“接受:应用程序/ json”放入请求标头中。 (我没有关于令牌类型的明确信息,所以我只是假设“Bearer”在示例中是正确的。也许这已经错了。)

我不知道如何处理才能找到解决方案。也许我缺少的一点不在我的cURL请求中,而是在AD和/或App Service的Azure设置中。我希望得到你方的帮助。

1 个答案:

答案 0 :(得分:2)

你走在正确的轨道上。

访问令牌

使用OAuth2 or OIDC成功对Azure AD进行身份验证后,您将获得access token。访问令牌是基于64位编码的JSON Web令牌(JWT),可用于访问其他受保护资源。

访问令牌可能如下所示:

EwAoA8l6BAAU ... 7PqHGsykYj7A0XqHCjbKKgWSkcAg==

您可以使用https://jwt.io进一步探索其内容。

注意:缩短上述令牌。完整的形式,很长。

在其他工作中,您需要访问令牌,以针对使用相同身份提供程序(在本例中为Azure AD)保护的任何API执行将来的请求。

访问受保护的API

但是,在使用令牌访问任何API之前,必须首先授予Azure AD应用程序必要的权限。见link

注意:该链接适用于v1.0 Azure AD端点。

一旦您获得所需的权限排序,您就可以开始执行请求了。您提出的请求看起来像,例如

GET https://graph.microsoft.com/v1.0/me 
Authorization: Bearer eyJ0eXAiO ... 0X2tnSQLEANnSPHY0gKcgw
Host: graph.microsoft.com

此处,令牌是Authorization: Bearer之后的内容。

进一步阅读

有关详细信息,请参阅此link。该链接包含有关如何使用v2.0 Azure AD端点的说明,但总体思路是相同的:

  1. 注册应用
  2. 授予应用以访问资源的权限
  3. 获取访问令牌
  4. 使用令牌执行请求