【问题标题】:GET User returns Authorization_IdentityNotFound errorGET 用户返回 Authorization_IdentityNotFound 错误
【发布时间】:2019-09-14 03:26:14
【问题描述】:

我正在构建一个具有简单电子邮件密码登录的应用程序。我想使用 Microsoft Graph 来返回已登录用户的个人资料信息(我现在没有使用 office365 OAuth)。

我设置了一个操作,试图从我所属的组织中获取此用户数据(即名字或个人资料照片)。我收到了这个错误:

"line":113,
"message":"Client error: GET https://graph.microsoft.com/v1.0/users/{user}
           resulted in a 401 Unauthorized response:
{ 
  "error": {
    "code": "Authorization_IdentityNotFound",
     "message": "The identity of the calling application (truncated...)"
  }
}

我已经按照 Microsoft Graph 教程 (step 2) 中的说明设置了应用程序,这是我使用 repository readme 编写的代码:

class MsGraphService implements iAction
{
    protected $accessToken;

    public function __construct()
    {
        $guzzle = new \GuzzleHttp\Client();
        $url = 'https://login.microsoftonline.com/'.ENV('MSGRAPH_TENAND_ID').'/oauth2/token?api-version=1.0';
        $token = json_decode($guzzle->post($url, [
            'form_params' => [
                'client_id' => ENV('MSGRAPH_CLIENT_ID'),
                'client_secret' => ENV('MSGRAHP_CLIENT_SECRET'),
                'resource' => 'https://graph.microsoft.com/',
                'grant_type' => 'client_credentials',
            ],
        ])->getBody()->getContents());
        $this->accessToken = $token->access_token;
    }

    public function execute($data)
    {
        $graph = new Graph();
        $graph->setAccessToken($this->accessToken);
        $user = $graph->createRequest("GET", sprintf("/users/%s",$data['email']))
                      ->setReturnType(Model\User::class)
                      ->execute();
        return $user->getGivenName();
    }
}

accesstoken属性被抓到了,所以我觉得app配置没问题。

可能是关于 API 权限的问题,具体来说:应用程序权限

我也询问过this on GitHub

【问题讨论】:

  • 您是否收到了您注册的应用程序的管理员同意书?此外,请记住,客户端凭据通常不是 PHP 的合适选择。客户端凭据应在服务器上使用,而不应在客户端上使用。

标签: php microsoft-graph-api microsoft-graph-sdks


【解决方案1】:

您可能会遇到问题,因为您尝试使用 AzureAD V1 身份验证端点。让 AzureAD v2 端点与 Microsoft Graph 一起工作要容易得多。这里有详细的操作方法https://docs.microsoft.com/en-us/graph/tutorials/php?tutorial-step=3

V1 和 V2 之间的主要区别在于您不再使用 resource 参数,而是使用范围来表示您想要访问。

【讨论】:

  • 您好,谢谢您的回答!我正在阅读这些教程,但我正在寻找它有点不同,实际上,当用户授权应用程序与他/她的证书连接时,第 3 步是有效的。我需要的是应用程序本身可以在没有登录用户的情况下读取组织内的任何用户信息。无论如何,我尝试切换端点以获取访问令牌到 v2,但我收到 400 错误:(
  • 您可能没有使用正确的端点。 v2 端点是 https://login.microsoftonline.com/common/oauth2/v2.0/token 而不是 https://login.microsoftonline.com/common/oauth2/token?api-version=2.0
【解决方案2】:

当尝试使用 API 获取用户相关信息时(没有登录用户),您应该向管理员请求读取该信息的权限。为了为您的应用程序设置正确的权限,您应该:

  1. 转到https://portal.azure.com 并登录
  2. 点击Azure Active Directory
  3. 转到应用注册
  4. 选择您现有的应用程序并点击查看 API 权限
  5. 选择 + 添加权限 / Microsoft Graph / 应用程序权限 / 用户 / 用户。全部阅读
  6. 征得管理员同意

这样,您将能够在没有登录用户的情况下从您的应用程序中获取用户数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 2021-04-06
    • 2014-04-26
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多