microsoft graph api для создания онлайн-собрания программно, но сталкивается с ошибкой 403

Я использую Microsoft Graph Api (PHP- ›msGraph SDK) для создания онлайн-встреч. Я столкнулся с ошибкой 403, может кто-нибудь мне помочь.

$clientId = "***********************************";
$clientSecret = "***********************************";
$tenantId = '***********************************';
$responseUri = "http://localhost:8888/moodle39";



$guzzle = new \GuzzleHttp\Client();
$url = 'https://login.microsoftonline.com/' . $tenantId . '/oauth2/v2.0/token';
$token = json_decode($guzzle->post($url, [
    'form_params' => [
        'client_id' => $clientId,
        'client_secret' => $clientSecret,
        'scope' => 'https://graph.microsoft.com/.default',
        'grant_type' => 'client_credentials',
    ],
])->getBody()->getContents());
$accessToken = $token->access_token;

//Create a new Graph client. 
$graph = new Graph(); 
$graph->setAccessToken($accessToken);

$onlinemeet->startDateTime = "2020-09-02T14:30:34.2444915";
$onlinemeet->endDateTime = "2020-09-02T15:30:34.2444915";
$onlinemeet->subject = "Test Meeting";
$jso = json_encode($onlinemeet);
$user = $graph->createRequest("POST", "/me/onlineMeetings")->addHeaders(array("Content-Type" => "application/json"))->attachBody($jso)->setReturnType(User::class) ->execute();

Исключение - ошибка клиента: POST https://graph.microsoft.com/beta/me/onlineMeetings привел к ответу 403 Forbidden: {error: {code: Forbidden, message:, innerError: {request-id: bd43aa57-511e-4 (усечено ...)

При создании приложения на лазурном портале

под разрешением API я дал разрешение на доступ

GraphApi- ›Делегированные разрешения-› онлайн-встречи.ЧитатьНаписать.

Может ли кто-нибудь помочь мне с правильным примером или правильным синтаксисом в PHP.

Спасибо !!..


person sreenu malae    schedule 01.09.2020    source источник
comment
Я не вижу, чтобы вы добавляли учетные данные в свой квест в своем коде.   -  person ewong    schedule 02.09.2020
comment
проверить вопрос. Я только что отредактировал вопрос с полным кодом. Спасибо @ewong !!   -  person sreenu malae    schedule 02.09.2020
comment
Увидев код, я узнал, что вы используете клиентский кредитный поток и вызываете конечную точку «me / onlineMeetings». Обычно при аутентификации в качестве приложения вы не можете использовать делегированные разрешения - области, предоставляемые пользователем. Таким образом, вы должны использовать здесь разрешения для приложений. И как мы видим в документация разрешения для приложений здесь не поддерживаются. Вот почему вы получаете ошибку 403.   -  person Shiva Keshav Varma    schedule 02.09.2020
comment
@ Shiva-MSFTIdentity Спасибо за ваш ответ. Да, я использую делегированные разрешения. Если вы видите документацию, которой вы мне поделились. Делегированная (рабочая или учебная учетная запись) OnlineMeetings.ReadWrite Поддерживает. Если моя учетная запись является личной, она не работает. Но у меня была рабочая учетная запись, поэтому делегированные разрешения поддерживаются.   -  person sreenu malae    schedule 03.09.2020
comment
@sreenumalae После запуска этого кода он запрашивал у вас учетные данные рабочей или учебной учетной записи? А вы следите за публичным образцом? если да, то поделитесь ссылкой.   -  person Shiva Keshav Varma    schedule 03.09.2020
comment
Вы не используете делегированную аутентификацию. Строка 'grant_type' => 'client_credentials', указывает, что вы используете аутентификацию только для приложений. Здесь вам нужно выполнить поток аутентификации пользователя, например код аутентификации. Учебное пособие есть здесь.   -  person Jason Johnston    schedule 03.09.2020


Ответы (1)


Вы не можете использовать поток учетных данных клиента, чтобы получить токен для вызова конечной точки / me. Для потока учетных данных клиента он обычно используется для межсерверных взаимодействий, которые должны выполняться в фоновом режиме и не взаимодействовать с пользователем немедленно (пользователь не вошел в систему). Для конечной точки / me обычно требуется вход в систему, поэтому следует использовать поток кода аутентификации.

Кстати, API в версии / beta в Microsoft Graph могут быть изменены. Использование этих API в производственных приложениях не поддерживается. Поэтому рекомендуется использовать версию /v1.0.

введите описание изображения здесь

см. здесь.


Обновление:

Подобных образцов много, надеюсь они вам помогут:

Образец PHP OAuth 2.0 Код.

Аутентификация и авторизация с использованием Auth0 в PHP.

person Carl Zhao    schedule 14.09.2020
comment
Не могли бы вы предоставить пример php (не Laravel) для потока кода аутентификации. Так будет полезнее. - person sreenu malae; 21.09.2020
comment
@sreenumalae Привет, я обновил ответ. Если мой ответ полезен для вас, вы можете принять его как ответ (щелкните галочку рядом с ответом, чтобы переключить его с серого на заполненный). Это может быть полезно для других членов сообщества. - person Carl Zhao; 22.09.2020
comment
Здравствуйте, Ваш ответ мне очень помог. В моем коде, как только пользователь вошел в систему, я получу код, используя который я получаю токен доступа. с этим я пытаюсь создать собрание, но получаю сообщение об ошибке Exception - Class 'User' not found in 156 of /mod/certificate/vendor/microsoft/microsoft-graph/src/Http/GraphResponse.php: Выведена ошибка строки 291 /mod/certificate/vendor/microsoft/microsoft-graph/src/Http/GraphRequest.php: вызов Microsoft \ Graph \ Http \ GraphResponse- ›getResponseAsObject () строки 128 / mod / certificate / view. php: вызов Microsoft \ Graph \ Http \ GraphRequest- ›execute () - person sreenu malae; 23.09.2020
comment
@sreenumalae Привет, у меня нет возможности ответить вам в комментарии, потому что мне нужно, чтобы вы предоставили свой код, чтобы облегчить мое тестирование. Можете ли вы сначала принять этот ответ, а затем задать новый вопрос? Прикрепите свой код и сообщение об ошибке, я отвечу вам как можно скорее. - person Carl Zhao; 23.09.2020
comment
Я решил проблему, большое спасибо за ваш быстрый ответ. - person sreenu malae; 23.09.2020