我正在开发一个网络应用程序,用户可以上传文件(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。
1条答案
按热度按时间lo8azlld1#
请注意,客户端凭据流使用**
Application
权限,而Graph Explorer在用户登录时使用Delegated
权限。由于您可以通过登录Graph Explorer调用所有API,因此请尝试更改为Delegated**流,同时生成访问令牌而不是客户端凭据。
我尝试通过Postman在我的环境中重现相同的问题,结果如下:
我注册了一个Azure AD应用程序,并添加了
API permissions
,如下所示:现在我通过Postman生成了访问令牌,方法是将
grant_type
更改为password而不是client_credentials,如下所示:响应:
有了上面的访问令牌,我能够使用下面的查询获得用户列表:
答复:
当我使用相同的令牌访问根驱动器中的用户文件时,我成功地得到了如下所示的响应:
响应:
为了确认这一点,我使用相同的用户帐户登录,在Graph Explorer中运行了相同的查询,并得到了相同的响应,如下所示:
答复:
在您的情况下,只需将
grant_type
更改为代码的password,如下所示:确保在
username
和password
参数中传递与您用于登录Graph Explorer的凭据相同的凭据。