Доступ к ресурсам Microsoft Graph с помощью токена доступа к приложению (без входа пользователя) - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть институциональная учетная запись электронной почты, и я хочу получить доступ к ее содержимому (и отправлять электронные письма) с помощью веб-приложения PHP, которое я пишу, и я хочу, чтобы он имел доступ к этой учетной записи без входа пользователя (онибудет зарегистрировано в моем приложении, которое будет отправлять предопределенные сообщения на основе действий пользователя).

Я зарегистрировал приложение, используя Microsoft Портал регистрации приложений , используя учетные данные этой учетной записи учреждения, и получил мой client_id и client_secret (пароль).

Я использую приведенный ниже код для выполнения аутентификации на основе этих инструкций :

<code>function preformat($string) {
    return "<pre>".htmlentities($string)."
";} функция getGraphAccessToken ($ domain, $ client_id, $ password) {$ graph_endpoint = "https://graph.microsoft.com/.default"; $ token_endpoint =" https://login.microsoftonline.com/".$domain."/oauth2/v2.0/token"; $ token_postdata = implode ("&", ["grant_type = client_credentials", "client_id =". urlencode ($ client_id), ""client_secret = ". urlencode ($ password)," scope = ". urlencode ($ graph_endpoint)]); $ ch = curl_init (); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, true); curl_setopt ($ ch, CURLOPT_POST, правда);curl_setopt ($ ch, CURLOPT_URL, $ token_endpoint);curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ token_postdata);curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, false);$ token_json = curl_exec ($ ch);curl_close ($ ч);$ token_object = json_decode ($ token_json);return "Авторизация:". $ token_object-> token_type. "". $ token_object-> access_token;} function queryGraph ($ auth_header, $ feed) {$ ch = curl_init ();curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, true);curl_setopt ($ ch, CURLOPT_POST, false);curl_setopt ($ ch, CURLOPT_URL, "https://graph.microsoft.com/v1.0/".$feed); curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt ($ ch, CURLOPT_HTTPHEADER, массив ($ auth_header," Принять: application / json "тип-данных: минимальный-тип-данных: od; данные-данные);application / json; odata = minimalmetadata "," Prefer: return-content ")); $ graph_query = curl_exec ($ ch); curl_close ($ ch); return $ graph_query;} $ auth_header = getGraphAccessToken ($ domain, $ client_id,$ client_secret); предварительное форматирование эха ($ auth_header); $ query_me = queryGraph ($ auth_header, "me"); предварительное форматирование эха ($ query_me);

Этот код успешно захватывает токен доступа и запросыот https://graph.microsoft.com/v1.0/me/ ожидающих получения информации об учетной записи учреждения (в качестве теста на успех). Однако я получаю следующий ответ:

{
  "error": {
    "code": "BadRequest",
    "message": 
"Current authenticated context is not valid for this request.
 This occurs when a request is made to an endpoint that requires user sign-in.
 For example, /me requires a signed-in user.
 Acquire a token on behalf of a user to make requests to these endpoints.
 Use the OAuth 2.0 authorization code flow for mobile and native apps
 and the OAuth 2.0 implicit flow for single-page web apps.",
    "innerError": {
      "request-id": "3073f561-43db-49d3-9851-7f50037abb61",
      "date": "2018-12-31T17:28:45"
    }
  }
}

Что я здесь упускаю или делаю неправильно?

1 Ответ

0 голосов
/ 31 декабря 2018

Вы не можете использовать /me с аутентификацией только для приложений, вам нужно сослаться на пользователя через его userPrincipalName - /users/{upn}.В конце концов, как Граф узнает, на какое «я» вы ссылаетесь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...