Laravel Socialite 的 Microsoft OAuth2 提供程序

4.5.1 2024-07-12 02:43 UTC

This package is auto-updated.

Last update: 2024-08-26 21:35:46 UTC


README

composer require socialiteproviders/microsoft

安装与基本用法

请参阅基本安装指南,然后按照以下特定提供程序的说明进行操作。

config/services.php 中添加配置

'microsoft' => [    
  'client_id' => env('MICROSOFT_CLIENT_ID'),  
  'client_secret' => env('MICROSOFT_CLIENT_SECRET'),  
  'redirect' => env('MICROSOFT_REDIRECT_URI'),
  'proxy' => env('PROXY')  // Optional, will be used for all requests
],

添加提供程序事件监听器

Laravel 11+

在 Laravel 11 中,默认的 EventServiceProvider 提供程序已被移除。相反,您可以在 AppServiceProviderboot 方法中使用 Event 面具的 listen 方法添加监听器。

  • 注意:除非您使用自己的提供程序覆盖它们,否则您无需为内置的 socialite 提供程序添加任何内容。
Event::listen(function (\SocialiteProviders\Manager\SocialiteWasCalled $event) {
    $event->extendSocialite('microsoft', \SocialiteProviders\Microsoft\Provider::class);
});
Laravel 10 或以下配置包的监听器以监听 `SocialiteWasCalled` 事件。

将事件添加到 app/Providers/EventServiceProvider 中的 listen[] 数组中。有关详细说明,请参阅基本安装指南

protected $listen = [
    \SocialiteProviders\Manager\SocialiteWasCalled::class => [
        // ... other providers
        \SocialiteProviders\Microsoft\MicrosoftExtendSocialite::class.'@handle',
    ],
];

用法

现在您应该能够像通常使用 Socialite 一样使用此提供程序(假设您已安装了 facade)

return Socialite::driver('microsoft')->redirect();

扩展功能

租户详情

您还可以在检索用户信息的同时检索租户信息,这可能很有用,如果您需要仅允许您的租户/或筛选特定租户。

为此,您首先需要编辑您的 config/services.php 文件,并在您的微软设置数组中包括 'include_tenant_info',如下所示

'microsoft' => [
        'client_id' => env('MICROSOFT_CLIENT_ID'),
        'client_secret' => env('MICROSOFT_CLIENT_SECRET'),
        'redirect' => env('MICROSOFT_REDIRECT_URI'),
        'tenant' => 'common',
        'include_tenant_info' => true,
    ],

注意:如果您使用 'tenant' => env('MICROSOFT_TENANT_ID'),则应确保您的 .env 文件仍然使用 'common' 作为租户 ID。

默认返回的租户字段是

  • ID
  • displayName
  • city
  • country
  • countryLetterCode
  • state
  • street
  • verifiedDomains

刷新令牌

默认情况下,Microsoft 不会返回刷新令牌。但是,如果您需要刷新令牌,则需要添加 offline_access 范围。添加范围是在 redirect 方法中完成的,如 Laravel 文档 中所述。

租户类型

以下列出的是 'tenant' 的支持值(由 MS 身份平台定义),可用于控制谁可以登录应用程序。

  • common - 用于 Microsoft 帐户和工或学校帐户(最宽容),
  • organizations - 仅用于工或学校帐户,
  • consumers - 仅用于 Microsoft 帐户(仅适用于 Xbox、Teams for Life 或 Outlook 等服务),
  • tenant identifiers - 例如租户 ID 或域名(最严格)。

注意:当使用

  • tenant => 'common'
  • include_tenant_info => true

配置 services.php 中的微软条目并尝试使用 'consumer' 帐户登录时,用户的租户值将为 null

例如

$user = Socialite::driver('microsoft')->user();
if ($user->tenant === null) {

    // do some consumer/public specific workflow
    
} else {

    // do your work / school tenant workflow
    Log::info(sprintf("Tenant found - %s", $user->tenant->displayName));
     
}

其他租户字段 tenant_fields

任何其他字段都可以通过以下此处详细说明的属性名称返回。

例如,'tenantType', 'technicalNotificationMails' 可以这样请求

    'microsoft' => [
        'client_id' => env('MICROSOFT_CLIENT_ID'), 
        'client_secret' => env('MICROSOFT_CLIENT_SECRET'),
        'redirect' => env('MICROSOFT_REDIRECT_URI'), 
        'tenant' => env('MICROSOFT_TENANT_ID', 'common'), 
        'include_tenant_info' => true,
        'tenant_fields' => [ 'tenantType', 'technicalNotificationMails' ],
        'include_avatar' => true,
        'include_avatar_size' => '648x648',
    ],