PHPackages                             hwkdo/ms-graph-laravel - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. hwkdo/ms-graph-laravel

ActiveLibrary[API Development](/categories/api)

hwkdo/ms-graph-laravel
======================

This is my package ms-graph-laravel

v1.9.2(1mo ago)02944MITPHPPHP ^8.3

Since Oct 28Pushed 2mo agoCompare

[ Source](https://github.com/hwkdo/ms-graph-laravel)[ Packagist](https://packagist.org/packages/hwkdo/ms-graph-laravel)[ Docs](https://github.com/hwkdo/ms-graph-laravel)[ GitHub Sponsors](https://github.com/hwkdo)[ RSS](/packages/hwkdo-ms-graph-laravel/feed)WikiDiscussions main Synced 2w ago

READMEChangelogDependencies (16)Versions (32)Used By (4)

Microsoft Graph Laravel
=======================

[](#microsoft-graph-laravel)

Ein Laravel Package für die Integration mit Microsoft Graph API. Dieses Package bietet eine umfassende Lösung für die Verwaltung von Microsoft 365-Diensten wie Benutzer, E-Mails, OneDrive, Lizenzen und Abwesenheitsvorlagen.

Installation
------------

[](#installation)

Sie können das Package über Composer installieren:

```
composer require hwkdo/ms-graph-laravel
```

Sie können die Migrationen veröffentlichen und ausführen:

```
php artisan vendor:publish --tag="ms-graph-laravel-migrations"
php artisan migrate
```

Sie können die Konfigurationsdatei veröffentlichen:

```
php artisan vendor:publish --tag="ms-graph-laravel-config"
```

### Webhook-Job-Mappings initialisieren

[](#webhook-job-mappings-initialisieren)

Das Package enthält einen Seeder, um die Standard-Webhook-Job-Mappings zu erstellen:

```
php artisan db:seed --class=Hwkdo\\MsGraphLaravel\\Database\\Seeders\\GraphWebhookJobMappingSeeder
```

Alternativ können Sie den Seeder in Ihrem `DatabaseSeeder` registrieren:

```
// database/seeders/DatabaseSeeder.php
public function run(): void
{
    $this->call([
        \Hwkdo\MsGraphLaravel\Database\Seeders\GraphWebhookJobMappingSeeder::class,
    ]);
}
```

Der Seeder erstellt automatisch Mappings für folgende Webhook-Typen:

- `intracollect` - Formwerk Mail Webhooks für IntraCollect
- `angebote` - Bestellungen und Angebote Webhooks
- `ntopng` - Ntopng Webhooks
- `onedrive_filer` - OneDrive Filer Webhooks
- `onedrive_filerextern` - Externe OneDrive Filer Webhooks

Die Notification URLs werden automatisch basierend auf der `PORTAL_URL` Umgebungsvariable generiert.

Konfiguration
-------------

[](#konfiguration)

Fügen Sie die folgenden Umgebungsvariablen zu Ihrer `.env`-Datei hinzu:

```
# Microsoft Graph Grundkonfiguration
MSGRAPH_TENTANT_ID=your-tenant-id
MSGRAPH_DEFAULT_SUFFIX=your-domain.com
MICROSOFT_REDIRECT_URI=https://your-app.com/auth/callback

# Standard App Registration
MSGRAPH_APP_ID=your-client-id
MSGRAPH_APP_SECRET_KEY=your-client-secret

# OneDrive App Registration (optional)
MSGRAPH_APP_ID_ONEDRIVE=your-onedrive-client-id
MSGRAPH_APP_SECRET_KEY_ONEDRIVE=your-onedrive-client-secret

# Subscription App Registration (optional)
MSGRAPH_APP_ID_SUBSCRIPTION=your-subscription-client-id
MSGRAPH_APP_SECRET_KEY_SUBSCRIPTION=your-subscription-client-secret

# Subscription Secret
MSGRAPH_SUBSCRIBE_SECRET=your-subscription-secret

# Portal URL für Webhook-Benachrichtigungen
PORTAL_URL=https://portal.hwkdo.com

# Cache Konfiguration
MSGRAPH_CACHE_SECONDS=300

# Teams Bot (optional, für Benachrichtigungen per Teams-Chat)
MSGRAPH_TEAMS_BOT_ENABLED=false
MSGRAPH_TEAMS_BOT_APP_ID=your-teams-bot-app-id
MSGRAPH_TEAMS_BOT_APP_SECRET=your-teams-bot-app-secret
MSGRAPH_TEAMS_APP_CATALOG_ID=your-teams-catalog-app-id

# teams-sdk-rest Docker Service (external/teams-sdk-rest)
TEAMS_SDK_REST_URL=http://teams-sdk-rest:3978
TEAMS_API_KEY=your-teams-api-key
TEAMS_WEBHOOK_SECRET=your-shared-webhook-secret
TEAMS_SDK_TIMEOUT=30
TEAMS_WEBHOOK_LOG_REQUESTS=true
```

### Teams Bot Einrichtung

[](#teams-bot-einrichtung)

Der Teams-Bot nutzt den Docker-Service `external/teams-sdk-rest` (Microsoft Teams SDK v2).

1. **App Registration** für den Bot anlegen (getrennt von `MSGRAPH_APP_ID`)
2. **Azure Bot** (Bot Channels Registration) mit Microsoft App ID = Bot App ID
    - Messaging Endpoint: `https:///api/messages`
    - Kanal Microsoft Teams aktivieren
3. **teams-sdk-rest** starten und konfigurieren (`TEAMS_API_KEY`, `LARAVEL_WEBHOOK_URL`, `WELCOME_MESSAGE`, …)
4. **Laravel Webhook:** `{PORTAL_URL}/api/kunden/ms-graph-laravel/teams-webhook`
5. **Teams App Manifest** (`manifest.json` + Icons): `bots[].botId` und `webApplicationInfo.id` = Bot App ID ```
    "bots": [{ "botId": "DEINE-BOT-APP-REGISTRATION-ID", ... }],
    "webApplicationInfo": {
      "id": "DEINE-BOT-APP-REGISTRATION-ID",
      "resource": "https://RessourceUrl"
    }
    ```

    **Wichtig:** Ohne `webApplicationInfo.id` schlägt die Installation mit `[Forbidden] Caller is not authorized` fehl. Für die **App-Validierung** im Developer Portal `commandLists` mit Befehl `Hi` ergänzen: ```
    "commandLists": [
      {
        "scopes": ["personal"],
        "commands": [
          { "title": "Hi", "description": "Begrüßung" }
        ]
      }
    ]
    ```

    Der Webhook sendet automatisch eine Welcome-Nachricht (personal scope) und antwortet auf `Hi`.
6. App im **Teams Admin Center** in den Organisations-App-Katalog hochladen (nach Manifest-Änderung erneut!)
7. **API Permissions** (Application): `TeamsAppInstallation.ReadWriteSelfForUser.All` + Admin Consent
    - Alternative bei anhaltendem „Caller is not authorized“: `TeamsAppInstallation.ReadWriteForUser.All`
8. Env-Variablen setzen und `MSGRAPH_TEAMS_BOT_ENABLED=true`
    - `MSGRAPH_TEAMS_APP_CATALOG_ID` = `id` aus Graph/Katalog **nach** Upload (kann sich nach Neuveröffentlichung ändern!)

### Azure Setup

[](#azure-setup)

1. Erstellen Sie eine App-Registrierung im Azure Portal
2. Erstellen Sie einen Client Secret für die App
3. Weisen Sie die erforderlichen Microsoft Graph-Berechtigungen zu:
    - `User.Read.All` - Für Benutzerverwaltung
    - `Mail.Read` - Für E-Mail-Zugriff
    - `Files.Read.All` - Für OneDrive-Zugriff
    - `License.Read.All` - Für Lizenzverwaltung
    - `Presence.Read.All` - Für Anwesenheitsstatus

Verwendung
----------

[](#verwendung)

### Facade verwenden

[](#facade-verwenden)

```
use Hwkdo\MsGraphLaravel\Facades\MsGraphLaravel;

// Benutzer abrufen
$user = MsGraphLaravel::getUser('user@domain.com');

// Benutzerpräsenz abrufen
$presence = MsGraphLaravel::getUserPresence('user@domain.com');

// Benutzerteams abrufen
$teams = MsGraphLaravel::getUserTeams('user@domain.com');
```

### Dependency Injection verwenden

[](#dependency-injection-verwenden)

```
use Hwkdo\MsGraphLaravel\Services\UserService;
use Hwkdo\MsGraphLaravel\Services\LicenseService;

class UserController extends Controller
{
    public function __construct(
        private UserService $userService,
        private LicenseService $licenseService
    ) {}

    public function getUserInfo(string $email)
    {
        $user = $this->userService->getUser($email);
        $licenses = $this->licenseService->getLicenseDetails($email);

        return response()->json([
            'user' => $user,
            'licenses' => $licenses
        ]);
    }
}
```

Verfügbare Services
-------------------

[](#verfügbare-services)

### UserService

[](#userservice)

Verwaltung von Microsoft 365-Benutzern:

```
use Hwkdo\MsGraphLaravel\Services\UserService;

$userService = app(UserService::class);

// Benutzer nach UPN abrufen
$user = $userService->getUserByUpn('user@domain.com');

// Benutzer nach Alias abrufen
$user = $userService->getUserByAlias('user');

// Benutzer aktualisieren
$userService->update('user@domain.com', ['displayName' => 'New Name']);

// Benutzerpräsenz abrufen
$presence = $userService->getUserPresence('user@domain.com');

// Benutzerteams abrufen
$teams = $userService->getUserTeams('user@domain.com');

// Direkte Gruppen abrufen
$groups = $userService->getUserDirectGroups('user@domain.com');

// Transitive Gruppen abrufen
$groups = $userService->getUserTransitiveGroups('user@domain.com');
```

### LicenseService

[](#licenseservice)

Verwaltung von Microsoft 365-Lizenzen:

```
use Hwkdo\MsGraphLaravel\Services\LicenseService;

$licenseService = app(LicenseService::class);

// Lizenzdetails abrufen
$licenses = $licenseService->getLicenseDetails('user@domain.com');
```

### MailboxService

[](#mailboxservice)

E-Mail-Verwaltung:

```
use Hwkdo\MsGraphLaravel\Services\MailboxService;

$mailboxService = app(MailboxService::class);

// E-Mails abrufen, senden und verwalten
```

### OneDriveService

[](#onedriveservice)

OneDrive-Dateiverwaltung:

```
use Hwkdo\MsGraphLaravel\Services\OneDriveService;

$oneDriveService = app(OneDriveService::class);

// Dateien hochladen, herunterladen und verwalten
```

### OutOfOfficeTemplateService

[](#outofofficetemplateservice)

Abwesenheitsvorlagen-Verwaltung:

```
use Hwkdo\MsGraphLaravel\Services\OutOfOfficeTemplateService;

$oooService = app(OutOfOfficeTemplateService::class);

// Abwesenheitsvorlagen erstellen und verwalten
```

Artisan Commands
----------------

[](#artisan-commands)

Das Package stellt folgende Artisan-Befehle zur Verfügung:

```
# Abonnements überprüfen
php artisan msgraph:check-subscriptions

# Aktive Benutzer mit Abwesenheits-Cache aktualisieren
php artisan msgraph:refresh-active-users-with-ooo-cache
```

Webhook-Subscriptions
---------------------

[](#webhook-subscriptions)

Das Package unterstützt Microsoft Graph Webhook-Subscriptions für Echtzeit-Updates.

### Webhook-Job-Mappings

[](#webhook-job-mappings)

Webhook-Subscriptions werden in der Datenbank verwaltet. Jede Subscription ist mit einem Job verknüpft, der ausgeführt wird, wenn ein Webhook empfangen wird.

#### Neue Webhook-Subscription hinzufügen

[](#neue-webhook-subscription-hinzufügen)

```
use Hwkdo\MsGraphLaravel\Models\GraphWebhookJobMapping;
use App\Jobs\ProcessMyWebhook;

GraphWebhookJobMapping::create([
    'webhook_type' => 'my_webhook',
    'name' => 'my_webhook_name',
    'job_class' => ProcessMyWebhook::class,
    'filepath' => storage_path('app/webhooks/'),
    'upn' => 'user@domain.com',
    'resource' => "/users/user@domain.com/mailFolders('inbox')/messages",
    'notification_url' => GraphWebhookJobMapping::generateNotificationUrl('my_webhook'),
    'change_type' => 'created',
    'description' => 'Beschreibung der Subscription',
    'is_active' => true,
]);
```

#### Webhook-Subscription abrufen

[](#webhook-subscription-abrufen)

```
use Hwkdo\MsGraphLaravel\Models\GraphWebhookJobMapping;

// Alle aktiven Subscriptions
$subscriptions = GraphWebhookJobMapping::getActiveSubscriptions();

// Subscription nach Typ
$jobClass = GraphWebhookJobMapping::getJobClassForType('intracollect');

// Subscription nach Resource und URL
$subscription = GraphWebhookJobMapping::findByResourceAndNotificationUrl(
    "/users/user@domain.com/mailFolders('inbox')/messages",
    'https://portal.hwkdo.com/api/kunden/ms-graph-subscription/intracollect'
);
```

#### Webhook-Job erstellen

[](#webhook-job-erstellen)

Ihr Webhook-Job sollte die empfangenen Daten verarbeiten:

```
namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class ProcessMyWebhook implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public function __construct(
        public string $resource
    ) {}

    public function handle(): void
    {
        // Verarbeite die Webhook-Daten
        // $this->resource enthält die Microsoft Graph Resource ID
    }
}
```

### Webhook-Endpoint

[](#webhook-endpoint)

Das Package registriert automatisch einen Webhook-Endpoint unter:

```
POST /api/kunden/ms-graph-subscription/{typ}

```

Microsoft Graph sendet Webhooks an diese URL. Der `{typ}` Parameter bestimmt, welcher Job ausgeführt wird.

Features
--------

[](#features)

### Microsoft Graph Integration

[](#microsoft-graph-integration)

- **Automatische Token-Verwaltung**: OAuth-Tokens werden automatisch abgerufen, gecacht und erneuert
- **Mehrere App-Registrierungen**: Unterstützung für verschiedene Microsoft Graph-Anwendungen
- **Umfassende API-Abdeckung**: Benutzer, E-Mails, OneDrive, Lizenzen, Teams und mehr

### Services

[](#services)

- **UserService**: Vollständige Benutzerverwaltung mit UPN- und Alias-Suche
- **LicenseService**: Lizenzverwaltung und -überwachung
- **MailboxService**: E-Mail-Verwaltung und -verarbeitung
- **OneDriveService**: Datei-Upload, -Download und -verwaltung
- **OutOfOfficeTemplateService**: Abwesenheitsvorlagen-Management

### Webhooks &amp; Subscriptions

[](#webhooks--subscriptions)

- **Echtzeit-Updates**: Webhook-Subscriptions für E-Mails und OneDrive
- **Automatische Verwaltung**: Subscription-Lebenszyklus wird automatisch verwaltet
- **Mehrere Endpunkte**: Unterstützung für verschiedene Webhook-Endpunkte

### Allgemein

[](#allgemein)

- **Laravel HTTP Client**: Verwendet Laravels eingebauten HTTP-Client für alle Anfragen
- **Umfassendes Logging**: Alle Operationen werden für Debugging-Zwecke geloggt
- **Exception Handling**: Ordnungsgemäße Fehlerbehandlung mit detaillierten Fehlermeldungen
- **Caching**: Konfigurierbare Cache-Zeiten für bessere Performance

API-Referenz
------------

[](#api-referenz)

### UserService

[](#userservice-1)

#### `getUser(string $mail): ?User`

[](#getuserstring-mail-user)

Ruft einen Benutzer anhand der E-Mail-Adresse ab.

**Parameter:**

- `$mail`: E-Mail-Adresse des Benutzers

**Rückgabe:** Microsoft Graph User-Objekt oder null

#### `getUserByUpn(string $upn): User`

[](#getuserbyupnstring-upn-user)

Ruft einen Benutzer anhand des UPN (User Principal Name) ab.

**Parameter:**

- `$upn`: UPN des Benutzers

**Rückgabe:** Microsoft Graph User-Objekt

#### `getUserByAlias(string $alias): ?User`

[](#getuserbyaliasstring-alias-user)

Ruft einen Benutzer anhand des Alias ab.

**Parameter:**

- `$alias`: Alias des Benutzers

**Rückgabe:** Microsoft Graph User-Objekt oder null

#### `update(string $upn, array $data): User`

[](#updatestring-upn-array-data-user)

Aktualisiert Benutzerdaten.

**Parameter:**

- `$upn`: UPN des Benutzers
- `$data`: Zu aktualisierende Daten

**Rückgabe:** Aktualisiertes Microsoft Graph User-Objekt

#### `getUserPresence(string $upn): Presence`

[](#getuserpresencestring-upn-presence)

Ruft den Anwesenheitsstatus eines Benutzers ab.

**Parameter:**

- `$upn`: UPN des Benutzers

**Rückgabe:** Microsoft Graph Presence-Objekt

#### `getUserTeams(string $upn): array`

[](#getuserteamsstring-upn-array)

Ruft die Teams eines Benutzers ab.

**Parameter:**

- `$upn`: UPN des Benutzers

**Rückgabe:** Array von Microsoft Graph Team-Objekten

#### `getUserDirectGroups(string $upn): array`

[](#getuserdirectgroupsstring-upn-array)

Ruft die direkten Gruppen eines Benutzers ab.

**Parameter:**

- `$upn`: UPN des Benutzers

**Rückgabe:** Array von Microsoft Graph Group-Objekten

#### `getUserTransitiveGroups(string $upn): array`

[](#getusertransitivegroupsstring-upn-array)

Ruft die transitiven Gruppen eines Benutzers ab.

**Parameter:**

- `$upn`: UPN des Benutzers

**Rückgabe:** Array von Microsoft Graph Group-Objekten

### LicenseService

[](#licenseservice-1)

#### `getLicenseDetails(string $upn): array`

[](#getlicensedetailsstring-upn-array)

Ruft die Lizenzdetails eines Benutzers ab.

**Parameter:**

- `$upn`: UPN des Benutzers

**Rückgabe:** Array von Microsoft Graph LicenseDetails-Objekten

Testing
-------

[](#testing)

```
composer test
```

Changelog
---------

[](#changelog)

Bitte sehen Sie [CHANGELOG](CHANGELOG.md) für weitere Informationen zu den letzten Änderungen.

Contributing
------------

[](#contributing)

Bitte sehen Sie [CONTRIBUTING](CONTRIBUTING.md) für Details.

Security Vulnerabilities
------------------------

[](#security-vulnerabilities)

Bitte überprüfen Sie [unsere Sicherheitsrichtlinie](../../security/policy), wie Sicherheitslücken gemeldet werden.

Credits
-------

[](#credits)

- [hwkdo](https://github.com/hwkdo)
- [Alle Contributors](../../contributors)

License
-------

[](#license)

Die MIT-Lizenz (MIT). Bitte sehen Sie [License File](LICENSE.md) für weitere Informationen.

###  Health Score

48

—

FairBetter than 94% of packages

Maintenance90

Actively maintained with recent releases

Popularity15

Limited adoption so far

Community14

Small or concentrated contributor base

Maturity62

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~8 days

Recently: every ~2 days

Total

31

Last Release

31d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/72b6d361b5e84bd3dfecc691278039a815c252495b4624dd6f50caa27ff02655?d=identicon)[hwkdo](/maintainers/hwkdo)

---

Top Contributors

[![aleex1848](https://avatars.githubusercontent.com/u/17452861?v=4)](https://github.com/aleex1848 "aleex1848 (26 commits)")

---

Tags

laravelhwkdoms-graph-laravel

### Embed Badge

![Health badge](/badges/hwkdo-ms-graph-laravel/health.svg)

```
[![Health](https://phpackages.com/badges/hwkdo-ms-graph-laravel/health.svg)](https://phpackages.com/packages/hwkdo-ms-graph-laravel)
```

###  Alternatives

[dedoc/scramble

Automatic generation of API documentation for Laravel applications.

2.2k12.6M140](/packages/dedoc-scramble)[simplestats-io/laravel-client

Server-side analytics for Laravel that follows the full funnel from visit to registration to payment, attributed to the channel that drove it. Revenue, MRR, churn and ad-spend profit (ROAS/CAC) per channel. GDPR compliant, ad-blocker proof.

5226.7k](/packages/simplestats-io-laravel-client)[spatie/laravel-health

Monitor the health of a Laravel application

88212.7M188](/packages/spatie-laravel-health)[defstudio/telegraph

A laravel facade to interact with Telegram Bots

818355.4k3](/packages/defstudio-telegraph)[nativephp/mobile

NativePHP for Mobile

1.1k102.1k146](/packages/nativephp-mobile)[rawilk/profile-filament-plugin

Profile &amp; MFA starter kit for filament.

3915.5k](/packages/rawilk-profile-filament-plugin)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
