Реализация авторизации через Microsoft/Azure AD на сайте

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.
Разработка и обслуживание любых видов сайтов:
Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Реализация авторизации через Microsoft/Azure AD на сайте
Средняя
~2-3 рабочих дня
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1214
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    852
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1041
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    823
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    815

Реализация авторизации через Microsoft/Azure AD на сайте

Microsoft OAuth через Azure Active Directory — стандарт для B2B-приложений, корпоративных порталов и SaaS-сервисов, ориентированных на компании, использующие Microsoft 365. Позволяет сотрудникам входить с корпоративными учётными данными без создания отдельных паролей.

Типы приложений

  • Single-tenant — только пользователи одного конкретного Microsoft-тенанта (компании)
  • Multi-tenant — пользователи любых Azure AD организаций
  • Personal accounts — личные Microsoft/Outlook аккаунты
  • Combination — и организации, и личные аккаунты

Для корпоративных интеграций выбирают single-tenant или multi-tenant. Для потребительских приложений — personal + organizational accounts.

Регистрация приложения в Azure

  1. portal.azure.com → Azure Active DirectoryApp registrationsNew registration
  2. Указать Redirect URI: https://example.com/auth/microsoft/callback
  3. Выбрать Supported account types (single/multi-tenant)
  4. После создания: сохранить Application (client) ID и Directory (tenant) ID
  5. Certificates & secretsNew client secret → сохранить значение (видно только сразу)
  6. API permissions → добавить: openid, profile, email, User.Read

Laravel Socialite

composer require laravel/socialite socialiteproviders/microsoft-azure
// config/services.php
'azure' => [
    'client_id'     => env('AZURE_CLIENT_ID'),
    'client_secret' => env('AZURE_CLIENT_SECRET'),
    'redirect'      => env('AZURE_REDIRECT_URI'),
    'tenant'        => env('AZURE_TENANT_ID', 'common'), // 'common' для multi-tenant
],
class MicrosoftAuthController extends Controller
{
    public function redirect(): RedirectResponse
    {
        return Socialite::driver('azure')
            ->scopes(['openid', 'profile', 'email', 'User.Read'])
            ->redirect();
    }

    public function callback(): RedirectResponse
    {
        try {
            $msUser = Socialite::driver('azure')->user();
        } catch (\Exception $e) {
            return redirect('/login')->withErrors(['microsoft' => 'Ошибка авторизации Microsoft']);
        }

        $user = User::updateOrCreate(
            ['azure_id' => $msUser->getId()],
            [
                'name'              => $msUser->getName(),
                'email'             => $msUser->getEmail(),
                'email_verified_at' => now(),
                'azure_tenant_id'   => $msUser->user['tid'] ?? null,
            ]
        );

        Auth::login($user, remember: true);
        return redirect()->intended('/dashboard');
    }
}

Single-tenant: ограничение по организации

Для single-tenant вместо 'common' в tenant указывается конкретный Tenant ID:

// config/services.php
'azure' => [
    'tenant' => env('AZURE_TENANT_ID'), // конкретный тенант
],

Azure будет выдавать токены только пользователям этой организации.

Multi-tenant: валидация тенанта

При multi-tenant приложении нужно проверять, что пользователь из разрешённой организации:

public function callback(): RedirectResponse
{
    $msUser = Socialite::driver('azure')->user();
    $tenantId = $msUser->user['tid'] ?? null;

    $allowedTenants = explode(',', config('services.azure.allowed_tenants', ''));

    if ($allowedTenants && !in_array($tenantId, $allowedTenants)) {
        return redirect('/login')->withErrors([
            'microsoft' => 'Ваша организация не имеет доступа к этому приложению'
        ]);
    }

    // ...
}

Получение дополнительных данных через MS Graph

$graphResponse = Http::withToken($msUser->token)
    ->get('https://graph.microsoft.com/v1.0/me', [
        '$select' => 'id,displayName,mail,userPrincipalName,jobTitle,department,officeLocation',
    ]);

$profile = $graphResponse->json();
// $profile['jobTitle']      — должность
// $profile['department']    — подразделение
// $profile['officeLocation']— офис

Аватар сотрудника:

$photoResponse = Http::withToken($msUser->token)
    ->get('https://graph.microsoft.com/v1.0/me/photo/$value');

if ($photoResponse->ok()) {
    // $photoResponse->body() — бинарные данные изображения
    Storage::disk('public')->put("avatars/{$user->id}.jpg", $photoResponse->body());
}

SAML vs OAuth

Крупные корпоративные клиенты могут запросить поддержку SAML 2.0 вместо OAuth. Azure AD поддерживает оба. SAML реализуется через отдельную библиотеку (laravel-saml2, onelogin/php-saml) и имеет другую архитектуру.

Сроки работ

Этап Время
Регистрация в Azure + настройка разрешений 0.5 дня
OAuth callback + хранение tenant ID 1.5 дня
MS Graph: дополнительные данные, аватар 1 день
Тесты с реальным тенантом 1 день

Итого: 4–5 рабочих дней.