我使用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
失败
我发现一个引用说它可能因为令牌问题而失败。
答案 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;