我们在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设置中。我希望得到你方的帮助。
答案 0 :(得分:2)
你走在正确的轨道上。
使用OAuth2 or OIDC成功对Azure AD进行身份验证后,您将获得access token。访问令牌是基于64位编码的JSON Web令牌(JWT),可用于访问其他受保护资源。
访问令牌可能如下所示:
EwAoA8l6BAAU ... 7PqHGsykYj7A0XqHCjbKKgWSkcAg==
您可以使用https://jwt.io进一步探索其内容。
注意:缩短上述令牌。完整的形式,很长。
在其他工作中,您需要访问令牌,以针对使用相同身份提供程序(在本例中为Azure AD)保护的任何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端点的说明,但总体思路是相同的: