【问题标题】:Microsoft Graph API in Laravel ControllerLaravel 控制器中的 Microsoft Graph API
【发布时间】:2020-07-07 20:14:22
【问题描述】:

我正在使用组织 Outlook 帐户。我的目标是在 Laravel 控制器中获取日历事件列表。 我遵循的步骤:

  1. https://aad.portal.azure.com/ 中创建了简单的应用程序。我获得了应用程序(客户端)ID、目录 ID、clientSecrets、对象 ID/租户 ID,可用于登录并从 Microsoft 获取更多数据。

  2. 在 Laravel web.php 中创建控制器

    Route::get('/graph', 'microsoftapi@getCalendarData');
  1. 为 laravel 添加了 Microsoft Graph SDK。 https://github.com/microsoftgraph/msgraph-sdk-php
  composer require microsoft/microsoft-graph
  1. 我的 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 链接!!!!!

请回复我详细信息..

权限截图:

【问题讨论】:

    标签: php laravel api controls microsoft-graph-api


    【解决方案1】:

    在您的屏幕截图中,它表示您在应用注册中设置的权限(权限列表中的“未授予...”状态)尚未获得管理员同意。因为您使用的是客户端凭据,所以应用了应用程序权限(而不是委派权限)。由于尚未授予管理员同意,因此您的令牌中没有实际权限。

    您需要租户管理员才能进行应用注册并授予管理员同意。

    【讨论】:

    • 谢谢,即使我也这么认为。希望它是正确的解决方案
    【解决方案2】:

    我觉得这是关于需要提供应用程序来访问 API 数据的管理员权限 请参考此链接-https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-permissions-and-consent

    【讨论】:

      【解决方案3】:

      您必须在 azure 仪表板中的应用程序和您的 api 调用代码中授予 Calendars.Read 和 Calendars.ReadWrite 权限。

      参考链接:https://docs.microsoft.com/en-us/graph/permissions-referencehttps://docs.microsoft.com/en-us/graph/api/calendar-list-events?view=graph-rest-1.0&tabs=http

      【讨论】:

      • 您必须授予权限。请按照answer 中给出的步骤进行操作
      • 检查我附加的图片
      • 你检查过图片吗?附上问题..
      • 打开 (jwt.io) 并检查访问令牌是否具有正确的权限。如果没有注销并再次登录并授予权限。
      • 你检查过我的图片和代码了吗?有什么错误吗?我解码了我的令牌,但那里没有出现权限标签...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多