Laravel 控制器中的 Microsoft Graph API
Microsoft Graph API in Laravel Controller
我正在使用组织 Outlook 帐户。我的目标是在 Laravel 控制器中获取日历事件列表。
我遵循的步骤:
在 https://aad.portal.azure.com/ 中创建了简单的应用程序。我得到了应用程序(客户端)ID、目录 ID、clientSecrets、对象 ID/Tenant ID,可用于登录并从 Microsoft 获取更多数据。
在Laravelweb.php
中创建了控制器
Route::get('/graph', 'microsoftapi@getCalendarData');
- 为 laravel 添加了 Microsoft Graph SDK。 https://github.com/microsoftgraph/msgraph-sdk-php
composer require microsoft/microsoft-graph
- 我的 Laravel 控制器代码是:
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
use Jumbojett\OpenIDConnectClient;
use GuzzleHttp\Client;
use Microsoft\Graph\Graph;
use Microsoft\Graph\Model;
class microsoftapi extends Controller
{
public $accesstoken;
public function __construct()
{
$guzzle = new Client();
$tenantId = 'common';
$url = 'https://login.microsoftonline.com/' . $tenantId . '/oauth2/token?api-version=1.0';
$token = json_decode($guzzle->post($url, [
'form_params' => [
'client_id' => '*******************',///$clientId,
'client_secret' => '*****************', // $clientSecret,
'resource' => 'https://graph.microsoft.com/',
'grant_type' => 'client_credentials',
],
])->getBody()->getContents());
$this->accessToken = $token->access_token;
}
public function getCalendarData(){
$graph = new Graph();
$graph->setBaseUrl("https://graph.microsoft.com/")
->setApiVersion("v1.0")
->setAccessToken($this->accessToken);
dd($graph);
$user = $graph->createRequest("GET","/users/abc@***********.com/calendar/events")
->addHeaders(array("Content-Type" => "application/json"))
->setReturnType(\Microsoft\Graph\Model\User::class)
->setTimeout("1000")
->execute();
echo "Hello, I am $user->getGivenName() ";
}
通过 dd($graph);
当前输出,我得到的是:
Microsoft\Graph\Graph {#221 ▼
-_accessToken: "eyJ0eXAiOiJKV1QiLCJub25jZSI6IjNueHRoZzZrMllaTVZsRTMzUmNHOVhMbG9TekJRcUhVTzRVY2xLanpGV1EiLCJhbGciOiJSUzI1NiIsIng1dCI6IllNRUxIVDBndmIwbXhvU0RvWWZvbWpxZmpZVSIsImtp ▶"
-_apiVersion: "v1.0"
-_baseUrl: "https://graph.microsoft.com/"
-_proxyPort: null
}
所以我正在正确获取访问令牌。但是但是,如果我将 dd 评论为 // dd($graph);
,那么 getCalendarData
将不起作用。我的输出是:
GuzzleHttp\Exception\ClientException
Client error: `GET https://graph.microsoft.com/v1.0/users/abc@********.com/calendar/events` resulted in a `401 Unauthorized` response: {"error":{"code":"NoPermissionsInAccessToken","message":"The token contains no permissions, or permissions can not be un (truncated...)
有人知道问题出在哪里吗?
请告诉我详细信息..请不要发送我觉得难以理解的 Microsoft 链接!!!!!
请回复我详情..
权限截图:
您必须授予权限 Calendars.Read 和 Calendars.Read在您的 Azure 仪表板应用程序和 api 调用代码中写入。
参考link:https://docs.microsoft.com/en-us/graph/permissions-reference and https://docs.microsoft.com/en-us/graph/api/calendar-list-events?view=graph-rest-1.0&tabs=http
我觉得是关于需要提供应用程序访问 API 数据的管理员权限
请参考这个 link - https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-permissions-and-consent
在您的屏幕截图中,它表示您在应用程序注册时设置的权限尚未获得管理员同意(权限列表中的 "Not granted for..." 状态)。因为您使用的是客户端凭据,所以会应用应用程序权限(而非委托权限)。由于未获得管理员同意,因此您的令牌没有实际权限。
您需要租户管理员去您的应用程序注册并授予管理员同意。
我正在使用组织 Outlook 帐户。我的目标是在 Laravel 控制器中获取日历事件列表。 我遵循的步骤:
在 https://aad.portal.azure.com/ 中创建了简单的应用程序。我得到了应用程序(客户端)ID、目录 ID、clientSecrets、对象 ID/Tenant ID,可用于登录并从 Microsoft 获取更多数据。
在Laravelweb.php
中创建了控制器
Route::get('/graph', 'microsoftapi@getCalendarData');
- 为 laravel 添加了 Microsoft Graph SDK。 https://github.com/microsoftgraph/msgraph-sdk-php
composer require microsoft/microsoft-graph
- 我的 Laravel 控制器代码是:
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
use Jumbojett\OpenIDConnectClient;
use GuzzleHttp\Client;
use Microsoft\Graph\Graph;
use Microsoft\Graph\Model;
class microsoftapi extends Controller
{
public $accesstoken;
public function __construct()
{
$guzzle = new Client();
$tenantId = 'common';
$url = 'https://login.microsoftonline.com/' . $tenantId . '/oauth2/token?api-version=1.0';
$token = json_decode($guzzle->post($url, [
'form_params' => [
'client_id' => '*******************',///$clientId,
'client_secret' => '*****************', // $clientSecret,
'resource' => 'https://graph.microsoft.com/',
'grant_type' => 'client_credentials',
],
])->getBody()->getContents());
$this->accessToken = $token->access_token;
}
public function getCalendarData(){
$graph = new Graph();
$graph->setBaseUrl("https://graph.microsoft.com/")
->setApiVersion("v1.0")
->setAccessToken($this->accessToken);
dd($graph);
$user = $graph->createRequest("GET","/users/abc@***********.com/calendar/events")
->addHeaders(array("Content-Type" => "application/json"))
->setReturnType(\Microsoft\Graph\Model\User::class)
->setTimeout("1000")
->execute();
echo "Hello, I am $user->getGivenName() ";
}
通过 dd($graph);
当前输出,我得到的是:
Microsoft\Graph\Graph {#221 ▼
-_accessToken: "eyJ0eXAiOiJKV1QiLCJub25jZSI6IjNueHRoZzZrMllaTVZsRTMzUmNHOVhMbG9TekJRcUhVTzRVY2xLanpGV1EiLCJhbGciOiJSUzI1NiIsIng1dCI6IllNRUxIVDBndmIwbXhvU0RvWWZvbWpxZmpZVSIsImtp ▶"
-_apiVersion: "v1.0"
-_baseUrl: "https://graph.microsoft.com/"
-_proxyPort: null
}
所以我正在正确获取访问令牌。但是但是,如果我将 dd 评论为 // dd($graph);
,那么 getCalendarData
将不起作用。我的输出是:
GuzzleHttp\Exception\ClientException
Client error: `GET https://graph.microsoft.com/v1.0/users/abc@********.com/calendar/events` resulted in a `401 Unauthorized` response: {"error":{"code":"NoPermissionsInAccessToken","message":"The token contains no permissions, or permissions can not be un (truncated...)
有人知道问题出在哪里吗?
请告诉我详细信息..请不要发送我觉得难以理解的 Microsoft 链接!!!!!
请回复我详情..
权限截图:
您必须授予权限 Calendars.Read 和 Calendars.Read在您的 Azure 仪表板应用程序和 api 调用代码中写入。
参考link:https://docs.microsoft.com/en-us/graph/permissions-reference and https://docs.microsoft.com/en-us/graph/api/calendar-list-events?view=graph-rest-1.0&tabs=http
我觉得是关于需要提供应用程序访问 API 数据的管理员权限 请参考这个 link - https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-permissions-and-consent
在您的屏幕截图中,它表示您在应用程序注册时设置的权限尚未获得管理员同意(权限列表中的 "Not granted for..." 状态)。因为您使用的是客户端凭据,所以会应用应用程序权限(而非委托权限)。由于未获得管理员同意,因此您的令牌没有实际权限。
您需要租户管理员去您的应用程序注册并授予管理员同意。