图形用户ID属性返回空字符串

时间:2018-04-19 20:18:52

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

我使用microsoft / microsoft-graph SDK为我的一个身份验证提供程序提供了一个php web应用程序(托管在Azure上)。

我可以获取令牌并提取一些用户属性,但是' id'值似乎返回一个空字符串:

$me = $provider->get("me", $token);

printf('<br>Hello %s!', $me['displayName']);
printf('<br>First Name: %s', $me['givenName']);
printf('<br>Last Name: %s', $me['surname']);
printf('<br>ID: %s', $me['id']);   // returns nothing
printf('<br>Email: %s', $me['userPrincipalName']);
printf('<br>Country: %s', $me['country']);
printf('<br>Postal Code: %s', $me['postalCode']);

根据User reference,我应该能够将用户ID值作为字符串获取。

我也在使用thenetworg/oauth2-azure作为项目的一部分,以下内容确实返回了GUID。它与我正在寻找的ID相同吗?来自Graph的唯一用户ID?或者它是一个不同的ID?

printf('<br>ID: %s', $resourceOwner->getId()); 

理想情况下,我希望像所有其他属性一样直接从Graph获取ID值。我有什么遗失的东西,我需要为ID属性做些特别的事吗? (好吧,很明显......)是Graph,php库还是别的问题?

感谢您的协助。

[更新]

好的,所以备份一步:我有两页:

第1页包含许多身份验证选项的链接。 第2页是来自其中一个选项的重定向 - Microsoft Work and School选项。

第1页现在使用以下内容创建链接:

$mscallbackUrl = $urlcore . '/ms-callback.php';
$provider = new TheNetworg\OAuth2\Client\Provider\Azure([
    'clientId'      => $msAppId,
    'clentSecret'   => $msAppSecret,
    'redirectUri'   => $mscallbackUrl
]);
$provider->urlAPI = "https://graph.microsoft.com/v1.0/";
$provider->resource = "https://graph.microsoft.com/";

$authUrl = $provider->getAuthorizationUrl();

使用上面完全相同的代码设置$ provider然后使用以下内容连接到Graph:

$token = $provider->getAccessToken('authorization_code', [
    'code' => $_GET['code']
]);

try {
    $graph = new \Microsoft\Graph\Graph();
    $graph->setAccessToken($token->getToken());
    $me = $graph->createRequest("GET", "/me")
        ->setReturnType(Model\User::class)
        ->execute();

    printf('<br>Hello %s!', $me->getDisplayName());
    printf('<br>ID: %s', $me->id);

此代码在$me = $graph->createRequest失败 我发现一个引用说它可能因为令牌问题而失败。

1 个答案:

答案 0 :(得分:1)

我认为有一些事情可能导致混乱。默认情况下,oauth2-azure库会对AAD Graph资源(https://graph.windows.net)进行身份验证,而不是Microsoft Graph资源(https://graph.microsoft.com),因此您需要验证是否请求了访问令牌正确的资源。

其次,AAD Graph不返回id字段,因此返回null。我相信MS Graph的相关等效字段为oid

第三,您使用oauth2-azure库访问AAD Graph而不是Microsoft Graph的microsoft-graph库。获得访问令牌后,您可以将其传递到新的Graph实例中,如下所示:

$graph = new \Microsoft\Graph\Graph();
$graph->setAccessToken($token->getToken());
$me = $graph->createRequest("GET", "/me")
    ->setReturnType(Model\User::class)
    ->execute();

echo $me->id;