php Microsoft Graph发布SPO许可证,列出驱动器文件

nnsrf1az  于 2023-03-11  发布在  PHP
关注(0)|答案(1)|浏览(228)

我正在开发一个网络应用程序,用户可以上传文件(DXF和步骤文件)到我的客户Onedrive通过Microsofty图形API.
我花了很多时间试图使连接工作与我自己的开发帐户在Onedrive和阅读了很多其他故障排除之前在Stackoverflow和微软的网站,但我不能让它工作。
所以到目前为止我所做的是:

  • 我在onedrive(test)

    上有一个包含Sharepoint的Office 365企业版帐户和一个虚拟文件
  • 我在www.example.com有一个帐户azure.portal.com
  • 我已经在Azure Active Directory中注册了一个应用程序,创建了密钥并创建了所有权限,如下所示

  • 我安装了微软图表

使用下面的代码,我将成为一个访问令牌

require __DIR__ . '/vendor/autoload.php';

use Microsoft\Graph\Graph;
use Microsoft\Graph\Model;
$guzzle = new \GuzzleHttp\Client();
    

$tenantId = '6329a6cd-3d15-4f10-bef9-b5d52b1122fe';
$clientId = 'c01da8d9-01d1-43bb-93cf-5278d38aed7e';
$clientSecret = 'SECRET KEY HERE';

$url = 'https://login.microsoftonline.com/' . $tenantId . '/oauth2/token';
$user_token = json_decode($guzzle->post($url, [
    'form_params' => [
        'client_id' => $clientId,
        'client_secret' => $clientSecret,
        'resource' => 'https://graph.microsoft.com/',
        'grant_type' => 'client_credentials',
        'username' => 'jeroen@jebawebdesign.onmicrosoft.com',
        'password' => 'my-password'
    ],
])->getBody()->getContents());

$accessToken = $user_token->access_token;

接下来我要做的是测试与访问令牌的连接,然后奇怪的事情发生了。
与下面的代码,我收到所有的帐户数据.

$client = new \GuzzleHttp\Client(['headers' => ['Authorization' => 'Bearer '.$accessToken, 'Host' => 'graph.microsoft.com']]);
$users = $client->get('https://graph.microsoft.com/v1.0/users');
echo $users->getBody();

当我尝试访问根驱动器中的文件时,我会收到错误消息“租户没有SPO许可证解决方案”,但我有一个包含Sharepoint的商业许可证?

$client = new \GuzzleHttp\Client(['headers' => ['Authorization' => 'Bearer '.$accessToken, 'Host' => 'graph.microsoft.com']]);
$drive = $client->get('https://graph.microsoft.com/v1.0/users/253f61d2-e692-4be3-9f13-d8a88a9dda1b/drive/root');
echo $drive ->getBody();

当我通过https://developer.microsoft.com/en-us/graph/graph-explorer登录时,我可以调用所有接收正确结果的API。

lo8azlld

lo8azlld1#

请注意,客户端凭据流使用**Application权限,而Graph Explorer在用户登录时使用Delegated权限。
由于您可以通过登录Graph Explorer调用所有API,因此请尝试更改为
Delegated**流,同时生成访问令牌而不是客户端凭据。

我尝试通过Postman在我的环境中重现相同的问题,结果如下:

我注册了一个Azure AD应用程序,并添加了API permissions,如下所示:

现在我通过Postman生成了访问令牌,方法是将grant_type更改为password而不是client_credentials,如下所示:

POST https://login.microsoftonline.com/<tenantID>/oauth2/token
client_id: <appID>
client_secret: <secret>
resource: https://graph.microsoft.com/
grant_type:password
username: admin@xxxxxxxxxx.onmicrosoft.com
password:xxxxxxxxxx

响应:

有了上面的访问令牌,我能够使用下面的查询获得用户列表:

GET https://graph.microsoft.com/v1.0/users

答复:

当我使用相同的令牌访问根驱动器中的用户文件时,我成功地得到了如下所示的响应

GET https://graph.microsoft.com/v1.0/users/db5ccaa9-d0c0-4bfa-8693-xxxxxxxxxxx/drive/root

响应:

为了确认这一点,我使用相同的用户帐户登录,在Graph Explorer中运行了相同的查询,并得到了相同的响应,如下所示:

GET https://graph.microsoft.com/v1.0/users/db5ccaa9-d0c0-4bfa-8693-xxxxxxxxxxx/drive/root

答复:

在您的情况下,只需将grant_type更改为代码的password,如下所示:

require __DIR__ . '/vendor/autoload.php';

use Microsoft\Graph\Graph;
use Microsoft\Graph\Model;
$guzzle = new \GuzzleHttp\Client();
    

$tenantId = '6329a6cd-3d15-4f10-bef9-b5d52b1122fe';
$clientId = 'c01da8d9-01d1-43bb-93cf-5278d38aed7e';
$clientSecret = 'SECRET KEY HERE';

$url = 'https://login.microsoftonline.com/' . $tenantId . '/oauth2/token';
$user_token = json_decode($guzzle->post($url, [
    'form_params' => [
        'client_id' => $clientId,
        'client_secret' => $clientSecret,
        'resource' => 'https://graph.microsoft.com/',
        'grant_type' => 'password', //Replaced 'client_credentials' with 'password'
        'username' => 'jeroen@jebawebdesign.onmicrosoft.com',
        'password' => 'my-password'
    ],
])->getBody()->getContents());

$accessToken = $user_token->access_token;

确保在usernamepassword参数中传递与您用于登录Graph Explorer凭据相同的凭据。

相关问题